绑定工作没有INotifyPropertyChanged,为什么?
这就是我们通常的做法:
public class ViewModel : INotifyPropertyChanged { string _test; public string Test { get { return _test; } set { _test = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged([CallerMemberName] string property = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); }
现在我们的属性可以被视图中的多个元素使用,例如:
更改TextBox
值将更新TextBlock
内容。 我们可以在视图模型中设置值,视图会自动更新。
如果我们写这样的视图模型
public class ViewModel { public string Test { get; set; } }
然后视图仍然有效 (例如,更改TextBox
值将更新TextBlock
)。 当然,不可能再轻松地从视图模型更新Test
值(不再需要更新事件)。 但我的问题是视图: 为什么视图能够工作 ? 它是在后台构建更多内容还是检查某些内容的逻辑?
[…]您正在遇到WPF的另一个隐藏方面,即WPF的数据绑定引擎将数据绑定到PropertyDescriptor实例,如果源对象是纯CLR对象并且未实现INotifyPropertyChanged接口,则该实例将包装source属性。 并且数据绑定引擎将尝试通过PropertyDescriptor.AddValueChanged()方法订阅属性更改事件。 当目标数据绑定元素更改属性值时,数据绑定引擎将调用PropertyDescriptor.SetValue()方法将更改后的值传回源属性,并且它将同时引发ValueChanged事件以通知其他订阅者(在本例中,其他订阅者将是ListBox中的TextBlocks。
如果您正在实现INotifyPropertyChanged,那么您有责任在需要将数据绑定到UI的每个属性集中实现更改通知。 否则,更改将不会像您期望的那样同步。
请参阅: 没有INotifyPropertyChanged的数据绑定