Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 依赖项属性比普通的CLR属性有很多优点。如何?_Wpf - Fatal编程技术网

Wpf 依赖项属性比普通的CLR属性有很多优点。如何?

Wpf 依赖项属性比普通的CLR属性有很多优点。如何?,wpf,Wpf,为什么microsoft说Dependency属性比普通CLR属性有很多优势?依赖属性可以做的所有事情都可以通过普通属性来完成吗?基本上,有了DP,你会有很多普通属性没有的事件。我知道注册它们很乏味,但它们非常灵活:) 更多信息请参见Kishore的链接:p基本上,有了DP,你会有很多正常属性没有的事件。我知道注册它们很乏味,但它们非常灵活:) Kishore链接中的更多信息:依赖性属性很难进行单元测试,因此不应在ViewModels中使用(正如有些人所做的),但仅在WPF UI控件中使用依赖性

为什么microsoft说Dependency属性比普通CLR属性有很多优势?依赖属性可以做的所有事情都可以通过普通属性来完成吗?

基本上,有了DP,你会有很多普通属性没有的事件。我知道注册它们很乏味,但它们非常灵活:)


更多信息请参见Kishore的链接:p

基本上,有了DP,你会有很多正常属性没有的事件。我知道注册它们很乏味,但它们非常灵活:)


Kishore链接中的更多信息:依赖性属性很难进行单元测试,因此不应在ViewModels中使用(正如有些人所做的),但仅在WPF UI控件中使用依赖性属性很难进行单元测试,因此不应在ViewModels中使用(如有些人所做的),但只有在WPF UI控件中

虽然Kishore Kumar的链接中的答案非常准确,但我想补充一点:实际上没有“正常属性”这样的东西。属性实际上只是伪装的方法调用,因此您可以以任何适合的方式实现它们

C#3确实添加了自动属性,它在字段顶部实现属性,并且使用字段作为属性的备份存储肯定非常常见。虽然你可以称之为“正常”,但这类房产并没有什么特别之处。就CLR而言,DP是一个普通属性:它以正常的方式提供getter和setter,这意味着任何理解CLR属性的语言在访问属性时都可以使用普通属性语法

这并不是说简单的字段支持属性是唯一常见的实现。例如,许多类在其属性访问器中做额外的工作来支持
INotifyPropertyChanged
。但如果说这些不是“正常”属性,那就太奇怪了

所以在某种意义上,DP只是实现普通属性的许多不同方法之一

所以要回答这个问题:是的,它是“可以通过依赖属性可以做的普通属性来做所有事情”,因为您只需要使用依赖属性作为普通属性的实现


现在,如果您想让您的属性提供DP提供的所有相同行为,而不在您的实现中实际使用DP系统……那将是一个很大的工作。在某些情况下,这甚至是不可能的:例如,如果您想要一个属性,可以在ControlTemplate中参与TemplateBinding,那么据我所知,它绝对必须是DP。但如果您忽略了WPF高度专用的DP特性,那么是的,您可以重新创建等效的行为。毕竟,WPF只是代码。因此,如果WPF可以做些什么,你也可以-如果有足够的时间和资源,你可以编写自己的WPF版本。

虽然Kishore Kumar链接中的答案非常明确,但我想补充一点:实际上没有“正常属性”这样的东西。属性实际上只是伪装的方法调用,因此您可以以任何适合的方式实现它们

C#3确实添加了自动属性,它在字段顶部实现属性,并且使用字段作为属性的备份存储肯定非常常见。虽然你可以称之为“正常”,但这类房产并没有什么特别之处。就CLR而言,DP是一个普通属性:它以正常的方式提供getter和setter,这意味着任何理解CLR属性的语言在访问属性时都可以使用普通属性语法

这并不是说简单的字段支持属性是唯一常见的实现。例如,许多类在其属性访问器中做额外的工作来支持
INotifyPropertyChanged
。但如果说这些不是“正常”属性,那就太奇怪了

所以在某种意义上,DP只是实现普通属性的许多不同方法之一

所以要回答这个问题:是的,它是“可以通过依赖属性可以做的普通属性来做所有事情”,因为您只需要使用依赖属性作为普通属性的实现

现在,如果您想让您的属性提供DP提供的所有相同行为,而不在您的实现中实际使用DP系统……那将是一个很大的工作。在某些情况下,这甚至是不可能的:例如,如果您想要一个属性,可以在ControlTemplate中参与TemplateBinding,那么据我所知,它绝对必须是DP。但如果您忽略了WPF高度专用的DP特性,那么是的,您可以重新创建等效的行为。毕竟,WPF只是代码。因此,如果WPF可以做些什么,那么你也可以——如果有足够的时间和资源,你可以编写自己的WPF版本