如何将Foreground绑定到ViewModel中的属性?

我想将TextBlock的foreground属性绑定到ViewModel中的Property。

这不起作用:

编辑

查看:

TextBlock Text="{Binding Path=FullName, Mode=OneWay}" Foreground="{Binding Path=ForegroundColor}" Margin="0 5 3 5" 

代码背后:

 CustomerHeaderViewModel customerHeaderViewModel = new CustomerHeaderViewModel(); customerHeaderViewModel.LoadCustomers(); CustomerHeaderView.DataContext = customerHeaderViewModel; 

查看型号:

 private System.Windows.Media.Brush _foregroundColor; _foregroundColor = System.Windows.Media.Brushes.DarkSeaGreen; public System.Windows.Media.Brush ForegroundColor { get { return _foregroundColor; } set { _foregroundColor = value; OnPropertyChanged("ForegroundColor"); } } public CustomerHeaderViewModel() { ForegroundColor = System.Windows.Media.Brushes.Red; } 

所有其他属性(文本等)正确绑定。

我究竟做错了什么?

检查您的解决方案是否如此:查看:

         

视图模型:

 public class MainVM : INotifyPropertyChanged { protected void OnPropertyChanged(string porpName) { var temp = PropertyChanged; if (temp != null) temp(this, new PropertyChangedEventArgs(porpName)); } public event PropertyChangedEventHandler PropertyChanged; private System.Windows.Media.Brush _foregroundColor = System.Windows.Media.Brushes.DarkSeaGreen; public string FullName { get { return "Hello world"; } } public System.Windows.Media.Brush ForegroundColor { get { return _foregroundColor; } set { _foregroundColor = value; OnPropertyChanged("ForegroundColor"); } } } 

运行应用程序

并记住,如果你想在VM中设置ForegroundColor的新值,你可以这样做:

 ForegroundColor = System.Windows.Media.Brushes.Red; 

提出PropertyChangedEvent

根据您的问题的新信息,您可以尝试这个解决方案:

CustomerHeaderViewModel.cs

 class CustomerHeaderViewModel : INotifyPropertyChanged { public ObservableCollection Customers { get; set; } public void LoadCustomers() { ObservableCollection customers = new ObservableCollection(); //this is where you would actually call your service customers.Add(new Customer { FirstName = "Jim", LastName = "Smith", NumberOfContracts = 23 }); customers.Add(new Customer { FirstName = "Jane", LastName = "Smith", NumberOfContracts = 22 }); customers.Add(new Customer { FirstName = "John", LastName = "Tester", NumberOfContracts = 33 }); customers.Add(new Customer { FirstName = "Robert", LastName = "Smith", NumberOfContracts = 2 }); customers.Add(new Customer { FirstName = "Hank", LastName = "Jobs", NumberOfContracts = 5 }); Customers = customers; } protected void OnPropertyChanged(string porpName) { var temp = PropertyChanged; if (temp != null) temp(this, new PropertyChangedEventArgs(porpName)); } public event PropertyChangedEventHandler PropertyChanged; private System.Windows.Media.Brush _foregroundColor = System.Windows.Media.Brushes.DarkSeaGreen; public System.Windows.Media.Brush ForegroundColor { get { return _foregroundColor; } set { _foregroundColor = value; OnPropertyChanged("ForegroundColor"); } } } 

CustomerHeaderView.xaml

                    

在呈现的场景中,ForegroundColor属性驻留在CustomerHeaderViewModel.cs中,因此它对所有客户都是值。 在CustomerHeaderView.xaml中,我为UserControl添加了x:Name,以便有可能引用此元素的DataContext。 如果您不想对UserControl使用x:Name,可以尝试这样做:

  

请记住,此控件的DataContext是在MainWindow.cs中设置的。

MainWindow.cs

 public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { CustomerHeaderViewModel customerHeaderViewModel = new CustomerHeaderViewModel(); customerHeaderViewModel.LoadCustomers(); CustomerHeaderView.DataContext = customerHeaderViewModel; } } 

应用

将UI元素放在视图模型中不是一个好习惯。 您的视图模型必须仅封装业务locig。

如果要更改UI中依赖于文本框值的任何内容的颜色,则在XAML中使用数据触发器是一种更好的做法。

你可以这样做:

Viewmodel:

 public class MainVm : INotifyPropertyChanged { protected void OnPropertyChanged(string porpName) { var temp = PropertyChanged; if (temp != null) temp(this, new PropertyChangedEventArgs(porpName)); } public event PropertyChangedEventHandler PropertyChanged; public string FullName { get { return "Hello world"; } } } 

XAML(编辑使用颜色选择器,假设其控件的选定值被命名为“SelectedValue”并且它返回一个Brush对象)