当在模型-视图-ViewModel 体系结构存在似乎是 WPF 应用程序中实现 ViewModel 两个主要选项使其绑定数据的方式。我见过 DependencyProperty 用于视图将要针对绑定的属性的实现,我见过而实现 INotifyPropertyChanged ViewModel。

我的问题是何时应我更喜欢通过另一个吗?是否有任何性能差异?它实际上是赋予 WPF ViewModel 相关性的一个好办法吗?我需要考虑些什么当制定设计决策?

2008-11-14 21:33:17
问题评论:

有人更改为"DependencyProperty"的拼写错误"DependencyPropterty"?

请参阅编译器检查方法实现 INotifyPropertyChanged 的stackoverflow.com/questions/1329138/...避免让魔术以字符串形式的属性名称。

通常是一个实现 INotifyPropertyChanged 的类之间的依赖项属性和标准属性主要差别。依赖项属性可以是源或数据绑定中的目标,但 INotifyPropertyChanged 支持的普通属性可以用作源只。因此这些解决方案不是完全可互换的。数据绑定基础结构需要 DP 作为目标来处理,但源可能具有 INotifyPropertyChanged 支持的常规属性,或是公共 (dp)。

请参见.net 4.5 方式实现INotifyPropertyChanged stackoverflow.com/a/10595688/200442.

回答:

Kent 编写有关此主题的有趣的博客︰查看模型︰ 与 DependencyObjects POCOs.

简短的摘要︰

  1. DependencyObjects 不会被标记为可序列化
  2. DependencyObject 类重写,并密封在 Equals() 和 GetHashCode() 方法
  3. DependencyObject 具有线程关联 — 只可在其创建它的线程上访问

我更喜欢使用 POCO 方法。可以在此处找到的 PresentationModel (也称为 ViewModel) 实现 INotifyPropertyChanged 接口的基类︰ http://compositeextensions.codeplex.com

DependencyObject 还采用相关性的 WPF 库,而 POCO 则不,允许您查看模型,来推动某些其他用户界面栈 WPF 中没有可用 (Framework 精简版,单声道)。

很显然,然后为用户界面而不是针对业务层,只是生成依赖关系属性。

Dependancy 属性还需要 DependencyObject 父。真的不应该从 DependencyObject 继承您 ViewModel。

WPF 性能指南,根据 DependencyObjects 肯定优于实现 INotifyPropertyChanged 的 POCOs:

http://msdn.microsoft.com/en-us/library/bb613546.aspx

我必须同意在一个;-): blog.lexique-du-net.com/index.php?post/2010/02/24/...

死链接,请对其进行更新

如果您选择.NET Framework 版本 4,然后链接仍然起作用。它是不供"当前版本"。

选择是完全根据您的业务逻辑和 UI 抽象级别。如果您不希望很好地分离,然后 DP 将适合您。

DependencyProperties 将适用主要在 VisualElements 级别以便它不会是好主意,如果我们为每个我们业务需求创建大量的 DPs。另外还有 DP 比 INotifyPropertyChanged 更高成本。当您设计 WPF/Silverlight 尝试设计用户界面和 ViewModel 完全独立,这样我们可以在任何时间点更改 (根据主题) 和样式的布局和用户界面控件

引用此发布另外-- http://stackoverflow.com/questions/275098/what-applications-could-i-study-to-understand-datamodel-view-viewmodel链接都有大量的参考模型-视图-ViewModel 模式,是对此的讨论非常恰当的。

Jbe 发布更准确地回答了差异。只是因为虚拟机 (或演示者) 继承 DependencyObject 并不意味着它不能设置样式或不是逻辑上独立于视图,它只是属性值的存储是不同于 POCO 样式中显式声明的字段。谈话、 序列化、 逻辑的相等性和线程关联是真实问题的基于 DepedencyObject 的虚拟机必须处理的。

我的第二个 micahtan jbe 答案意见。

死链接,请对其进行更新

从表示形式的角度来看,我彻底喜欢使用依赖项属性和 cringe 在INotifyPropertyChanged的思想。除了string属性名称和事件订阅由于可能的内存泄漏, INotifyPropertyChanged是一个更为明确的机制。

依赖项属性意味着"时,这样做"使用易于理解的静态元数据。它是通过获取优雅为我投票的声明性方法。

INotifyPropertyChanged使用时还提供了 getter 和 setter 的属性的代码中添加更多的逻辑能力。

DependencyProperty示例︰

public static DependencyProperty NameProperty = DependencyProperty.Register( "Name", typeof( String), typeof( Customer ) );

public String Name
{
    set { SetValue( NameProperty, value ); }
    get { return ( String ) GetValue( NameProperty ); }
}

在 getter 和 setter---能做的就是只需分别调用 SetValue 和 GetValue、 不调用 getter/setter 的框架的其他部分中的 b/c,相反它仍将直接调用 SetValue,GetValue,以便不会可靠地执行属性逻辑。

INotifyPropertyChanged,定义一个事件︰

public event PropertyChangedEventHandler PropertyChanged;

然后只需有任何地方的任何逻辑在代码中,然后调用︰

// ...
// Something cool...
// ...

if( this.PropertyChanged != null )
{
    PropertyChanged( this, new PropertyChangedEventArgs( "Name" ) );
}

// More cool stuff that will reliably happen...

这可能是在 getter/setter,或其他任何地方。

您也可以从 DependencyProperties 获得更改通知。请参阅 PropertyMetadata.PropertyChangedCallback。示例︰ msdn.microsoft.com/en-us/library/ms745795.aspx

此外,从任何位置,而不仅仅是从属性的内部调用 SetValue

请输入您的翻译

INotifyPropertyChanged vs. DependencyProperty in ViewModel

确认取消