我应该何时在WPF中使用依赖项属性?
它们是静态的,因此与使用.NET属性相比,我们在内存上节省了很多。 在.NET属性上使用依赖项属性的其他好处是: 1)无需检查线程访问 2)提示要呈现的包含元素 等...
所以看起来我应该总是在我使用WPF的项目中使用依赖属性?
也许对于帮助类的一些微不足道的属性我可以 摆脱.NET属性......
答案 0 :(得分:18)
依赖属性是一个广泛的概念,可以解释哪些页面可能需要编写几页。所以只是回答你的主要问题,在
的地方使用Dependency属性您知道该属性将成为绑定目标,即您正在创建一个用户控件/自定义控件,并希望属性应该是绑定驱动的。
您需要自动属性更改通知(也是coerse和验证)。
我们希望在样式,主题,父级或默认值中继承值。
不需要在Model或ViewModel层上创建属性作为依赖属性的大多数时间,因为这对我们在模型/ VM中定义的大多数属性都没有太大帮助。每个实例都有值,因为它们会不断变化。解决依赖属性值本身就是一种负担,因此不建议不必要地依赖属性。
由于
答案 1 :(得分:14)
创建DependencyProperty
的主要原因是您编写自己的WPF控件。
DependencyProperties
可以用作绑定源和目标,并且可以设置动画。
所有框架控件的属性都实现为DependencyProperty
,这就是为什么你可以在XAML中进行强大的数据绑定。
但是在大多数情况下,就像使用MVVM模式一样,您不需要依赖项属性,INotifyPropertyChanged
就足够了。
答案 2 :(得分:7)
CLR属性与依赖属性
CLR属性直接从类的私有成员读取。类的Get()和Set()方法检索并存储属性的值。 而当您设置依赖项属性的值时,它不会存储在对象的字段中,而是存储在基类DependencyObject提供的键和值的字典中。条目的键是属性的名称,值是您要设置的值。
依赖属性的优点 减少内存消耗
Dependency Property仅在更改或修改属性时才存储该属性。因此,字段的大量内存是免费的。
属性值继承 这意味着如果没有为属性设置值,那么它将返回到继承树,直到获取值。
更改通知和数据绑定 每当属性更改其值时,它都会使用INotifyPropertyChange在Dependency Property中提供通知,并且还有助于数据绑定。
参与动画,样式和模板 依赖属性可以使用样式设置器设置动画,设置样式,甚至可以为控件提供模板。
<强>回调强> 每当更改属性时,您都可以调用回调。
<强>资源强> 您可以为XAML中的依赖项属性定义定义资源。
覆盖元数据 您可以使用PropertyMetaData定义依赖项属性的某些行为。因此,从派生属性覆盖元数据将不需要您重新定义或重新实现整个属性定义。
答案 3 :(得分:5)
主要区别在于,正常.NET属性的值是直接从类中的私有成员读取的,而DependencyProperty的值是在调用从DependencyObject继承的GetValue()方法时动态解析的。
当您设置依赖项属性的值时,它不会存储在对象的字段中,而是存储在基类DependencyObject提供的键和值的字典中。条目的键是属性的名称,值是您要设置的值。
依赖属性的优点是
查看以下网址,了解有关魔术的更多详情
答案 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
进行绑定,因为它在独立类中实现起来更容易,并且开销更少。就你原来的假设而言: