依赖属性是否与作为回调发出PropertyChanged事件的CLR属性相同?

时间:2016-04-10 06:41:50

标签: wpf xaml mvvm

这个问题与WPF数据绑定和MVVM模式有关。

我现在有点困惑,现在区分XAML.cs文件中定义的Dependency属性以及视图模型中定义的CLR属性,该属性绑定到组件的某些属性

例如,我在MyPage.xaml中有一个文本框。所以我创建了一个依赖属性来绑定MyPage.xaml.cs中的文本框文本属性,也许是一些String。下一次,我创建了一个viewModel MyPageViewModel.cs,它实现了INotifyPropertyChanged接口和 在那里创建了一个CLR属性(String),当它发生变化或者使用新值设置属性时会发出一个事件PropertyChanged。这些都是一样的吗?有什么不同吗?

  

我有3个问题

     
      
  1. 依赖属性是否与CLR属性相同,后者在更改时会发出PropertyChanged事件?

  2.   
  3. Dependency属性是否写在视图本身(MyPage.xaml.cs)中,还是可以包含在视图中   模型(MyPageViewModel.cs)?

  4.   
  5. 在MVVM模式中,我们使用更多的CLR属性,这些属性在属性更改期间发出事件。因此可以替换依赖属性   通过这种CLR属性?

  6.   

提前致谢。

1 个答案:

答案 0 :(得分:1)

依赖属性位于DependencyObject上,所有WPF UI元素都是从DependencyObject派生出来的(并且仅在那里工作),因为它是静态的,并将其值保存在一种分配的集合中到特定的DependencyObject(定义依赖属性)。可以在实际public static readonly DependencyProperty IsSpinningProperty = DependencyProperty.Register( "IsSpinning", typeof(Boolean), ... ); public bool IsSpinning { get { return (bool)GetValue(IsSpinningProperty); } set { SetValue(IsSpinningProperty, value); } } 之外的类中定义依赖项属性,以扩展其功能,而无需修改原始用户控件类。

当您编写用户控件并希望ViewModel允许绑定值并在更改时接收通知时,您将创建依赖项属性。

想象一下它就像一根USB线,你有一个插头和一个插座。 CLR属性就像插件一样,依赖属性就像容器一样。

依赖项属性允许您存储与控件关联的但不是实例的一部分。正如您在MSDN Examples

上看到的那样
GetValue

依赖项属性是静态的,SetValueDependencyObjectUserControl的方法(所有WPF UI元素都基于的基类)。

Depencency属性(以及附加属性/附加行为)也可用于扩展PropertyChanged的功能而不继承实际用户控件类型,即在某个值发生更改时通知ViewModel未提供由原始用户控件。

  
      
  1. Dependency Property是否与更改时发出PropertyChanged事件的CLR属性相同?
  2.   

不,它不一样。它们都是数据绑定引擎的两个方面。在视图上定义DP以允许视图模型绑定INPC属性(上升DependencyObject事件的属性)

  
      
  1. Dependency属性是写在视图本身(MyPage.xaml.cs)还是可以包含在视图模型中(MyPageViewModel.cs)?
  2.   

DP是视图层的一部分,因为它们依赖于GetValue,它是WPF框架的一部分,因此受到关注。虽然技术上没有任何东西阻止您在ViewModel中使用它们,但这会导致ViewModel与某种View技术紧密耦合,因此它并不完全符合MVVM模式。

请注意,虽然单元测试依赖属性可能非常困难,因为它们将值存储在它们所定义的类上但是在某些字典中{{1 } / SetValue方法扭曲。

最后但并非最不重要的,因为DependencyObject是所有UI的基类,它与从它创建的线程仿制的大多数类一样,这意味着你只能从你创建的线程中访问它可能会导致你在单元测试中遇到很多痛苦(特别是如果测试像MSTest那样并行运行。如果它现在仍然是真的则是Dunno)和你的代码。

  
      
  1. 在MVVM模式中,我们使用更多的CLR属性,这些属性在属性更改期间发出事件。那么依赖属性可以被这种CLR属性取代吗?
  2.   

在ViewModels中,您可以使用INotifyPropertyChanged。如果您正在开发用户控件,则不应该使用" CLR"来替换DP。属性,因为这使得该属性不适用于XAML中的数据绑定。

如果您的UI元素应该公开可以与数据绑定一起使用的属性,则必须使用依赖项属性(或非常相似的附加属性,但是您将附加属性放在子元素上。Grid.RowGrid.Column是附加属性的示例。)