我什么时候应该在WPF中使用依赖属性?

时间:2013-09-03 12:41:50

标签: c# wpf

我应该何时在WPF中使用依赖项属性?

它们是静态的,因此与使用.NET属性相比,我们在内存上节省了很多。 在.NET属性上使用依赖项属性的其他好处是: 1)无需检查线程访问 2)提示要呈现的包含元素 等...

所以看起来我应该总是在我使用WPF的项目中使用依赖属性?

也许对于帮助类的一些微不足道的属性我可以 摆脱.NET属性......

6 个答案:

答案 0 :(得分:18)

依赖属性是一个广泛的概念,可以解释哪些页面可能需要编写几页。所以只是回答你的主要问题,在

的地方使用Dependency属性
  1. 您知道该属性将成为绑定目标,即您正在创建一个用户控件/自定义控件,并希望属性应该是绑定驱动的。

  2. 您需要自动属性更改通知(也是coerse和验证)。

  3. 我们希望在样式,主题,父级或默认值中继承值。

  4. 不需要在Model或ViewModel层上创建属性作为依赖属性的大多数时间,因为这对我们在模型/ VM中定义的大多数属性都没有太大帮助。每个实例都有值,因为它们会不断变化。解决依赖属性值本身就是一种负担,因此不建议不必要地依赖属性。

  5. 由于

答案 1 :(得分:14)

创建DependencyProperty的主要原因是您编写自己的WPF控件。 DependencyProperties可以用作绑定源和目标,并且可以设置动画。 所有框架控件的属性都实现为DependencyProperty,这就是为什么你可以在XAML中进行强大的数据绑定。

但是在大​​多数情况下,就像使用MVVM模式一样,您不需要依赖项属性,INotifyPropertyChanged就足够了。

答案 2 :(得分:7)

enter image description here

CLR属性与依赖属性

CLR属性直接从类的私有成员读取。类的Get()和Set()方法检索并存储属性的值。 而当您设置依赖项属性的值时,它不会存储在对象的字段中,而是存储在基类DependencyObject提供的键和值的字典中。条目的键是属性的名称,值是您要设置的值。

依赖属性的优点 减少内存消耗

Dependency Property仅在更改或修改属性时才存储该属性。因此,字段的大量内存是免费的。

属性值继承 这意味着如果没有为属性设置值,那么它将返回到继承树,直到获取值。

更改通知和数据绑定 每当属性更改其值时,它都会使用INotifyPropertyChange在Dependency Property中提供通知,并且还有助于数据绑定。

参与动画,样式和模板 依赖属性可以使用样式设置器设置动画,设置样式,甚至可以为控件提供模板。

<强>回调 每当更改属性时,您都可以调用回调。

<强>资源 您可以为XAML中的依赖项属性定义定义资源。

覆盖元数据 您可以使用PropertyMetaData定义依赖项属性的某些行为。因此,从派生属性覆盖元数据将不需要您重新定义或重新实现整个属性定义。

答案 3 :(得分:5)

主要区别在于,正常.NET属性的值是直接从类中的私有成员读取的,而DependencyProperty的值是在调用从DependencyObject继承的GetValue()方法时动态解析的。

当您设置依赖项属性的值时,它不会存储在对象的字段中,而是存储在基类DependencyObject提供的键和值的字典中。条目的键是属性的名称,值是您要设置的值。

依赖属性的优点是

  1. 减少内存占用:
    当您认为UI控件的90%以上的属性通常保持其初始值时,为每个属性存储字段是一个巨大的耗散。依赖项属性仅通过在实例中存储已修改的属性来解决这些问题。默认值在依赖项属性中存储一次。
  2. 价值继承:
    访问依赖项属性时,将使用值解析策略解析该值。如果未设置本地值,则依赖项属性将向上导航逻辑树,直到找到值。当您在根元素上设置FontSize时,它将应用于下面的所有文本块,除非您覆盖该值。
  3. 更改通知:
    依赖项属性具有内置的更改通知机制。通过在属性元数据中注册回调,您可以在更改属性的值时收到通知。数据绑定也使用它。
  4. 查看以下网址,了解有关魔术的更多详情

    dependency properties in WPF

答案 4 :(得分:2)

也许你应该再看看MSDN上的Dependency Properties Overview页面。

就个人而言,当我真正需要时,我只会创建一个DependencyProperty。在大多数情况下,我使用数据类型和视图模型类中的普通CLR属性来绑定...这绝对没问题,只要我实现INotifyPropertyChanged接口。

因此,对于我所有常用的数据绑定,我使用普通的CLR属性。我声明Dependency Property,以便在UserControl中提供一些附加功能。

答案 5 :(得分:1)

当您希望在UserControl中进行数据绑定时,将使用依赖项属性,并且它是WPF Framework控件的标准数据绑定方法。 DP具有slightly better binding performance,并且在UserControl内部提供了所有内容以实现它们。

否则,您通常会在其他地方使用INotifyPropertyChanged进行绑定,因为它在独立类中实现起来更容易,并且开销更少。就你原来的假设而言:

  1. 你的变量有一个本地实例,你绝对不会在属性上节省任何开销,因为内置了重要的数据绑定逻辑。
  2. They must be accessed on the main thread