在ViewModel中,INotifyPropertyChanged与DependencyProperty的区别

376
在实现WPF应用程序中Model-View-ViewModel (MVVM)体系结构中的ViewModel时,似乎有两种主要选择如何使其可数据绑定。我见过一些实现使用DependencyProperty来绑定View的属性,也见过ViewModel实现INotifyPropertyChanged。 我的问题是什么情况下应该优先考虑其中一种?是否存在性能差异?将依赖项提供给WPF真的是个好主意吗?在做出设计决策时还需要考虑什么?

11
请参见 https://dev59.com/S3M_5IYBdhLWcg3wjj4p#1333874,了解实现 INotifyPropertyChanged 的编译器检查方法。避免属性名称成为魔法字符串。 - Ian Ringrose
12
实现INotifyPropertyChanged接口的类中,依赖属性和普通属性有显著区别。依赖属性可以作为数据绑定的源或目标,而带有INotifyPropertyChanged支持的普通属性只能作为源使用。因此这些解决方案不能完全互换。数据绑定基础设施需要DP作为目标才能工作,但源可以是带有INotifyPropertyChanged支持的普通属性或者普通DP。 - Mostafa Rezaei
4
请参考 https://dev59.com/bHM_5IYBdhLWcg3wlEPO#10595688,了解实现 INotifyPropertyChanged 接口的 .NET 4.5 方法。 - Daniel Little
请参考以下链接中最好的解释 https://dev59.com/U3A65IYBdhLWcg3w8zft#3552550 - Bizhan
14个回答

4

在创建诸如按钮之类的控件时,应该使用依赖属性(Dependency Properties)。在XAML中使用属性并使用所有WPF功能,这些属性必须是依赖属性。

然而,在ViewModel中最好使用INotifyPropertyChanged。使用INotifyPropertyChanged将使您能够拥有需要的getter/setter逻辑。

我建议查看Josh Smith的ViewModel基类版本,它已经实现了INotifyPropertyChanged:

http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/

我认为这是一个很好的ViewModel示例。


3

只有一个原因可以选择DependencyObject - 绑定会更好。尝试使用ListBoxTextBox的示例,将列表填充为来自INotifyPropertyChanged属性的数据与DependencyProperty进行比较,并从TextBox编辑当前项...


1
代码示例,请。 - MD TAREQ HASSAN

3

我更喜欢一种更直接的方法,我在Presentation Model Without INotifyPropertyChanged中写过这个方法。使用数据绑定的替代方案,您可以直接绑定到CLR属性,而无需任何繁琐的代码。您只需在视图模型中编写普通的.NET代码,当数据模型发生更改时,它会自动更新。


没有使用INotifyPropertyChanged,而是使用PropertyDescriptor,这会导致内存泄漏 - Tilak
我在博客文章中介绍的Update Controls库使用弱引用而非属性描述符。它不会泄漏内存。 - Michael L Perry
1
Michael,你的库生成了很多代码。我看不到它的好处。我可以通过生成具有生成 PropertyChanged 事件调用的模型包装器来实现相同的功能。 - Der_Meister

0

如果你想将属性暴露给其他控件,你必须使用依赖属性...但祝你好运,因为它们需要一段时间来理解...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接