如何在WPF窗口中发生更改时进行通知?
如何在WPF窗口中发生更改时进行通知?
我有一个ObservableCollection
绑定到一个WPF ListView
,所有的值都显示正确。但是,当双向绑定的值发生更改时,我该如何收到通知?
我应该像在Winforms
中那样使用INotifyPropertyChanged
吗?还是有更好的做法来做这些?
我看到有些人建议在线使用dependency properties
,但不确定是否应该这样做。
有两种情况:
1) 当数据改变时,通知UI-要么在ViewModel中,要么在绑定到一些UI元素的Model中(通常是由于数据绑定)。在这种情况下,你需要使用INotifyPropertyChanged。
举例:你有一个Person对象,将它的名字绑定到了一个TextBox上。Person需要实现INotifyPropertyChanged,并且需要将适当的代码附加到名字属性的setter中。
2) 创建自定义的UI元素,想要绑定数据。在这种情况下,你需要使用自定义的依赖属性。
举例:你有一个自定义的UI元素,在满足某些条件时会旋转。因此,你创建了一个可以绑定到ViewModel的IsLoading属性的IsSpinning依赖属性。然后,自定义控件使用IsSpinning属性来修改其行为。
希望这很清楚...
如果我想要添加属性的类是一个 DependencyObject
,我通常添加一个 DependencyProperty
。 如果该类是一个 POCO(普通的 clr 对象),那么我就实现 INotifyPropertyChanged
。
通常情况下,我的所有业务对象都是 POCO,因此我使用 INotifyPropertyChanged
。在 WPF 的世界中,我大多数使用的是 DependencyObjects(视图模型、自定义控件、UserControls...),因此它们是 DependencyProperties。一个例外是表示项目的 ViewModel(作为项目源中的项目使用)。在这种情况下,我认为 DependencyProperties 不是非常实用(因为 DependencyObjects 的 Equals() 和 GetHashCode() 是被封闭的,而且 DependencyObject 是线程相关的)。
如果您的类已经是一个 DependencyObject
,使用 DependencyProperties 可能会给您一些不错的优势:您不必备份每个值,一个强大的继承系统,默认值,每个属性的属性更改回调,值强制 ... (我喜欢 DependencyProperties,也许比其他人更喜欢它们 🙂
结论:
根据您的问题标题:如何在 WPF 窗口中有所变化时获得通知?我的方法是添加一个 DependencyProperty
,而不是 clr-property,因为 Window 是一个 DependencyObject
。顺便说一句,Visual Studio 有一个不错的代码片段来创建 DependencyProperties。