2015-07-13 112 views
2

我已经制作了几个页面的程序。这是一个简单的程序,我在顶部区域也会标记您目前的页面。对于每个页面,它都是一个新的标签定义。所有标签都在dockpanel.xaml中定义,稍后将其包含在mainwindow.xaml中。改变C#,WPF,MVVM标签的颜色

我喜欢用不同的颜色制作当前页面标签。

我的代码:

我DockPanel.xaml的第一个标签(其它都一样只数的变化)视图模型中的一个

<Label Name="Label1" Foreground="{Binding Path=Label1.Color}" Content="welcome" Grid.Column="0" HorizontalAlignment="Left" FontSize="20" FontWeight="Light" FontStyle="Italic"/> 

我DockPanelViewModel

public class DockPanelViewModel : ViewModelBase 
{ 
    #region Member fields 

    #endregion 

    #region Constructors 
    /// <summary> 
    /// The default constructor 
    /// </summary> 
    public DockPanelViewModel() 
    { 
    } 
    #endregion 

    #region Properties 

    protected Brush _color; 
    public Brush Color 
    { 
     get { return _color; } 
     set 
     { 
      _color = value; 
      NotifyPropertyChanged("Color"); 
     } 
    } 
    #endregion 

} 

后来定义页码:

Label1.Color = System.Windows.Media.Brushes.Yellow; 

重点是我的代码不想改变颜色,我不知道什么是错的:)

请帮忙。谢谢!

新增.. PageViewModelBase

public virtual DockPanelViewModel Label1 
    { 
     get 
     { 
      if (_Label1 == null) 
      { 
       _Label1 = new DockPanelViewModel() 
       { 
        //Text = "Back", 
        Color = System.Windows.Media.Brushes.Yellow, 

       }; 
      } 
      return _Label1; 
     } 
     set 
     { 
      _Label1 = value; 
      NotifyPropertyChanged("Label1"); 
     } 
    } 
+0

您是否已将视图的DataContext设置为您的ViewModel? – Measuring

+0

无法重现它,必须是绑定错误。但通常考虑使用样式设置前景等。 –

+4

检查您的绑定。它应该是{绑定路径=颜色}。 另外,在更改值时,应该在视图模型上设置值,而不是在标签上。 “ – Roemer

回答

1

它变得更糟,现在与更新的问题。请优化和修复你的命名!

为了使这项工作,这是我的建议:

  1. 你DockPanelViewModel似乎确定
  2. 创建DockPanelViewModel的一个实例,并将其分配给您的浏览
  3. 绑定的前景财产的DataContext您的标签到{绑定路径=颜色}(这是您的视图的颜色属性ModelModel
  4. 删除标签的“名称”(您不需要在适当的MVVM中)
  5. Whenev呃你想改变标签的颜色,只要改变颜色属性,如果你的viewmodel实例(你分配给视图的DataContext)
  6. 我不知道这个公共虚拟DockPanelViewModel Label1你最近添加到问题是。对我来说这似乎没有必要,删除它。

这里有一个工作示例: 查看:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Label Grid.Column="0" Foreground="{Binding Path=LabelColor}" Content="welcome" FontSize="20" FontWeight="Light" FontStyle="Italic"/> 
    <StackPanel Grid.Column="1"> 
     <Button Content="Red" Width="75" Command="{Binding ChangeColorCommand}" CommandParameter="#FF0000"/> 
     <Button Content="Green" Width="75" Command="{Binding ChangeColorCommand}" CommandParameter="#00FF00" /> 
    </StackPanel> 
</Grid> 

查看码:

public MainWindow() 
{ 
    InitializeComponent(); 
    var vm = new ViewModel(); 
    DataContext = vm; 
} 

视图模型:

public class ViewModel : INotifyPropertyChanged 
{ 
    public ICommand ChangeColorCommand { get; set; } 

    protected Brush _color; 
    public Brush LabelColor 
    { 
     get { return _color; } 
     set 
     { 
      _color = value; 
      OnPropertyChange(); 
     } 
    } 

    public ViewModel() 
    { 
     LabelColor = Brushes.Yellow; 
     ChangeColorCommand = new RelayCommand((o) => 
     { 
      LabelColor = new BrushConverter().ConvertFromString(o.ToString()) as SolidColorBrush; 
     }); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChange([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

RelayCommand是发现了著名的标准类在网络上到处都是。

-1

我已buttons代替lable和我的代码做这样的

//Method 
private void changeBackgroundOfButtons(string selectedButtons) 
    { 
     switch (selectedButtons) 
     { 
      case "home": 
       HomeButton.Background = (SolidColorBrush)new BrushConverter().ConvertFromString("#0199ED"); //HomeButton is my button 
       TextBlock1.Foreground = Brushes.White; //Also I changed the text of that button 
      case: 
      //For all my buttons 
     } 
    } 

在我Buttons单击事件我调用此方法。

private void HomeButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     changeBackgroundOfButtons("home"); 
     //Your code after this. 
    } 
+0

这甚至不是MVVM。 – Roemer

+0

@Roemer:我举例说明了如何改变颜色。但是我们可以通过任何方式将属性绑定到按钮或任何控件。 –