我有一个绑定到ObservableCollection
的{{1}},所有值都显示正确。但是,当具有双向绑定的内容发生变化时,如何获得通知?
我应该像WPF ListView
一样使用INotifyPropertyChanged
吗?或者有更好的做法来做这些吗?
我看到有人建议在线使用Winforms
,但不确定是否应该这样做。
答案 0 :(得分:4)
如果我要添加属性的类是DependencyObject
,我通常会添加DependencyProperty
。如果该类是POCO(普通的旧clr对象),那么我实现INotifyPropertyChanged
。
通常,我的所有业务对象都是POCO,因此我使用INotifyPropertyChanged
。在WPF世界中,我主要使用DependencyObjects(视图模型,自定义控件,UserControls ......),因此它们是DependencyProperties。 ViewModels是一个例外,它表示项目(用作项目源中的项目)。在这种情况下,我认为DependencyProperties不是很实用(因为DependencyObjects的Equals()和GetHashCode()是密封的,DependencyObject
是线程相关的)。
如果你的类已经是DependencyObject
,使用DependencyProperties可能会给你一些很好的优势:你不必支持每个值,强大的继承系统,默认值,属性改变了每个属性的回调,值强制...(我喜欢DependencyProperties可能比其他人更喜欢:)
结论:
根据您问题的标题:如何在WPF窗口中发生更改时收到通知?,我的方法是添加DependencyProperty
而不是clr-property,因为Window是一个DependencyObject
。顺便说一句,Visual Studio有一个很好的Snippet来创建DependencyProperties。
答案 1 :(得分:2)
实际上有两种情况:
1)当一段数据发生变化时通知UI - 在ViewModel或绑定到某些UI元素的Model中(通常由于数据绑定)。在这种情况下,您将使用INotifyPropertyChanged。
示例:您有一个Person对象,它将Name的名称绑定到TextBox。 Person需要实现INotifyPropertyChanged,并且需要将相应的代码附加到Name Property的setter。
2)创建您希望绑定数据的自定义UI元素。在这种情况下,您将使用自定义依赖项属性。
示例:您有一个自定义UI元素,在满足特定条件时会旋转。因此,您可以创建一个IsSpinning依赖项属性,您可以将其绑定到ViewModel的IsLoading属性。然后,自定义控件使用IsSpinning属性来修改其行为。
我希望这很清楚......
答案 2 :(得分:1)
你是对的。您可以使用INotifyPropertyChanged,也可以实现依赖项属性。我个人更喜欢INotifyPropertyChanged,它比依赖属性更轻,更容易实现。
答案 3 :(得分:1)
我通常使用INotifyPropertyChanged作为我的数据对象。
DependencyProperties只能在我认为的框架元素上实现。
编辑:我把它拿回去... DependencyProperties只能在DependencyObjects上实现(FrameworkElement是一个例子,因为它派生自UIElement,它派生自Visual派生自DependencyObject)。
如果您有UserControl,您可能希望实现依赖属性,以便可以将该属性(在XAML中)绑定到其他属性。您无法使用INotifyPropertyChanged执行此方案。