如何在WPF窗口中发生更改时收到通知?

时间:2011-03-02 21:47:19

标签: c# .net wpf data-binding inotifypropertychanged

我有一个绑定到ObservableCollection的{​​{1}},所有值都显示正确。但是,当具有双向绑定的内容发生变化时,如何获得通知?

我应该像WPF ListView一样使用INotifyPropertyChanged吗?或者有更好的做法来做这些吗?

我看到有人建议在线使用Winforms,但不确定是否应该这样做。

4 个答案:

答案 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执行此方案。