2015-07-13 111 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:我舉例說明了如何改變顏色。但是我們可以通過任何方式將屬性綁定到按鈕或任何控件。 –