WPF INotifyPropertyChanged如何工作?

这是在WPF / C#中使用Binding的典型INotifyPropertyChanged实现。

namespace notifications.ViewModel { class MainViewModel : INotifyPropertyChanged { public const string NamePropertyName = "CheckBoxState"; private bool _checkboxstate = true; public bool CheckBoxState { get { return _checkboxstate; } set { if (_checkboxstate == value) return; _checkboxstate = value; RaisePropertyChanged(NamePropertyName); } } public event PropertyChangedEventHandler PropertyChanged; private void RaisePropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } } 

我还有一个与CheckBoxState绑定的XAML代码。 在此处输入图像描述

       

这是MainWindow.xaml.cs,用于在DataContext和模型之间进行链接。

 public partial class MainWindow : Window { notifications.ViewModel.MainViewModel model = new notifications.ViewModel.MainViewModel(); public MainWindow() { InitializeComponent(); this.DataContext = model; } } 

当用户设置复选框时,我认为会发生的情况如下: IsChecked变为true,并且使用"{Binding Path=CheckBoxState, Mode=TwoWay}"CheckBoxState属性变为true以调用RaisePropertyChanged()并相应地调用PropertyChanged() 。 由于此函数的参数是CheckBoxState ,因此通知每个带有Path CheckBoxState Binding都会自行更新。

  • 该调用如何激活 ? C#背后的魔力是什么让它成为可能?
  • 为什么if (PropertyChanged != null)必要的? 谁设置PropertyChanged到什么价值?
  • Mode=TwoWay的含义看起来不仅可以发出变化的信号,而且当绑定中同名的其他Binding元素发生变化时也会更新内容,那么OneWay模式呢? 我们可以将Binding仅设置为源或仅设置目标吗?

这个电话是如何激活的? C#背后的魔力是什么让它成为可能?

此代码创建一个Binding对象,该对象将TextBlock的Text属性链接到ViewModel属性。 它还为ViewModel的PropertyChanged事件添加了一个事件处理程序,以便在ViewModel触发PropertyChanged事件(具有正确的属性)时更新文本值。

为什么if (PropertyChanged != null)必要的? 谁设置PropertyChanged到什么价值?

如果PropertyChanged事件为null,则触发它将导致NullReferenceException。

Mode=TwoWay的含义看起来不仅可以发出变化的信号,而且当绑定中同名的其他Binding元素发生变化时也会更新内容,那么OneWay模式呢? 我们可以将Binding仅设置为源或仅设置目标吗?

绑定模式是:

  • TwoWay:在ViewModel属性更改时更改边界值,反之亦然
  • OneWay:仅在ViewModel属性更改时更改边界值
  • OneWayToSource:仅在绑定值更改时更改ViewModel属性
  • OneTime:在创建应用程序或更改数据上下文时,将绑定值设置为ViewModel属性的值。

您可以在此处阅读有关它们的更多信息: http : //msdn.microsoft.com/en-us/library/system.windows.data.bindingmode.aspx