在WPF中何时应使用依赖属性?
与使用.NET属性相比,它们是静态的,因此我们可以节省大量内存。 使用依赖属性而不是.NET属性的其他优点包括: 1)无需检查线程访问 2)促使包含元素呈现 等等......
所以看起来在我使用WPF的项目中,我应该总是使用依赖属性?
也许对于一些辅助类的琐碎属性,我可以使用.NET属性……
在WPF中何时应使用依赖属性?
与使用.NET属性相比,它们是静态的,因此我们可以节省大量内存。 使用依赖属性而不是.NET属性的其他优点包括: 1)无需检查线程访问 2)促使包含元素呈现 等等......
所以看起来在我使用WPF的项目中,我应该总是使用依赖属性?
也许对于一些辅助类的琐碎属性,我可以使用.NET属性……
依赖属性是一个广泛的概念,解释起来可能需要写几页纸。所以为了回答你的主要问题,依赖属性用于以下情况:
您知道该属性将成为绑定目标,即您正在创建一个用户控件/自定义控件,并希望该属性应该由绑定驱动。
您想要自动属性更改通知(包括强制和验证)。
我们想要在样式、主题、父节点或默认值中进行值继承。
大多数情况下,我们不需要在模型或视图模型层创建依赖属性作为属性,因为这不会在内存节省方面有太大的帮助,因为我们在模型/VM中定义的大多数属性将具有每个实例的值,因为它们将不断更改。依赖属性值的解析本身就是一种负担,因此不建议不必要地使属性依赖。
谢谢
创建DependencyProperty
的主要原因是当您编写自己的WPF控件时。
DependencyProperties
可用作绑定源和目标,并且可以进行动画处理。
所有框架控件的属性都被实现为DependencyProperty
,这就是为什么您可以在XAML中进行强大的数据绑定。
然而,在大多数情况下,例如在MVVM模式中,您不需要依赖属性,INotifyPropertyChanged
就足够了。
查看以下网址以了解其中的神奇:
CLR 属性 vs. 依赖属性
CLR 属性直接从类的私有成员中读取。类的 Get() 和 Set() 方法检索和存储属性的值。 而当您设置依赖属性的值时,它不会存储在对象的字段中,而是存储在由基类 DependencyObject 提供的键和值字典中。条目的键是属性的名称,值是要设置的值。
依赖属性的优点 内存消耗更少
依赖属性仅在修改或更改时才存储属性。因此,大量用于字段的内存被释放。
属性值继承 如果未为属性设置任何值,则它将返回到继承树,直到获取值为止。
更改通知和数据绑定 每当属性更改其值时,在 Dependency Property 中使用 INotifyPropertyChange 提供通知,并帮助进行数据绑定。
参与动画、样式和模板 依赖属性可以通过样式设置器来设定动画、样式甚至控件的模板。
回调 每当更改属性时,您可以调用回调函数。
资源 您可以在 XAML 中定义依赖属性的定义资源。
覆盖元数据 使用 PropertyMetaData 可以定义依赖属性的某些行为。因此,从派生属性覆盖元数据不需要重新定义或重新实现整个属性定义。
DependencyProperty
。在数据类型和视图模型类中,我大多数情况下使用普通的CLR属性进行绑定... 只要我实现了INotifyPropertyChanged
接口,这是完全可以的。因此,对于我所有的常规数据绑定,我使用普通的CLR属性。我仅在需要为UserControl
提供一些附加功能时才声明Dependency Property
。UserControl
中进行数据绑定,是WPF框架控件的标准数据绑定方法。DP具有稍微更好的绑定性能,并且在UserControl
内部实现它们时提供了所有必要的内容。INotifyPropertyChanged
进行绑定,因为在独立类中实现它更容易,并且开销更小。至于您最初的假设: