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