28

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

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

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

也许对于一些辅助类的琐碎属性在这里和那里我可以摆脱.NET属性......

4

6 回答 6

20

依赖属性是一个宽泛的概念来解释它可能需要几页来编写。所以只是为了回答你的主要问题,依赖属性在哪里使用

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

  2. 您需要自动属性更改通知(强制和验证)。

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

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

谢谢

于 2013-09-03T12:53:41.770 回答
16

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

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

于 2013-09-03T12:57:03.153 回答
9

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

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

依赖属性的优点是

  1. 减少内存占用:
    当您认为 UI 控件的 90% 以上的属性通常保持其初始值时,为每个属性存储一个字段是一种巨大的浪费。依赖属性通过仅在实例中存储修改后的属性来解决这些问题。默认值在依赖属性中存储一次。
  2. 值继承:
    当您访问依赖项属性时,使用值解析策略来解析值。如果没有设置本地值,则依赖属性会向上导航逻辑树,直到找到一个值。当您在根元素上设置 FontSize 时,它​​适用于下面的所有文本块,除非您覆盖该值。
  3. 更改通知:
    依赖属性具有内置的更改通知机制。通过在属性元数据中注册回调,您会在属性值发生更改时收到通知。这也被数据绑定使用。

查看下面的 url 了解更多关于它背后的魔法的详细信息

WPF 中的依赖属性

于 2013-09-03T12:49:47.847 回答
7

在此处输入图像描述

CLR 属性与依赖属性

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

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

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

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

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

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

CallBacks 无论何时更改属性,您都可以调用回调。

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

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

于 2015-02-19T16:34:50.427 回答
3

也许您应该再看一下MSDN上的Dependency Properties Overview页面。

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

所以对于我所有常用的数据绑定,我使用普通的 CLR 属性。我声明 aDependency Property是为了在 a 中提供一些附加功能UserControl

于 2013-09-03T13:00:30.820 回答
2

当您希望在 a 中进行数据绑定时使用依赖属性UserControl,它是 WPF 框架控件数据绑定的标准方法。DP 的绑定性能稍好一些UserControl,并且在 a 内部实现它们时,一切都提供给您。

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

  1. 您的变量有一个本地实例,您绝对不会在属性上节省任何开销,因为内置了重要的数据绑定逻辑。
  2. 必须在主线程上访问它们
于 2013-09-03T12:53:18.363 回答