绑定工作没有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的数据绑定