读书人

WPF请教依赖项属性的功能

发布时间: 2013-05-02 09:39:29 作者: rapoo

WPF,请问依赖项属性的功能
一个摘自http://www.cnblogs.com/xiongpq/archive/2010/06/29/1767905.html的依赖项属性的例子:

public static DependencyProperty TextProperty =
DependencyProperty.Register("Text", //属性名称
typeof(string), //属性类型
typeof(TestDependencyPropertyWindow), //该属性所有者,即将该属性注册到那个类上
new PropertyMetadata("")); //属性默认值

public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}


关于依赖项属性的注册、定义,大概懂了。
我想问的是,对于上面那个例子而言,WPF的依赖项属性的功能体现在哪里啊?它哪些地方体现出了不同于普通的.NET属性的特殊功能的呢?或者你可以举个简单的例子来说明依赖项属性的特殊功能,谢谢
[解决办法]
简单来说,依赖属性是脱离了普通对象的,可以随便“注入”监视的值。这就好象是把原本放在你的对象内部的属性,拿出去离散地在一个内存数据库里统一管理。

在XAML风格的软件开发技术中,底层大量需要双向绑定支持,因此需要这种统一地“注入”式的数据管理模式。
[解决办法]
比如说你编写一个叫做 ABC 的功能丰富的自定义控件,你会为它编写 Grid.Row 属性么?不会的。

那么你在 XAML 中会为其实例声明 Grid.Row 属性么?会的!

编译器在解析 XAML 里边的 <local:ABC .... Grid.Row="2" .... > 这种代码时,就会调用Grid类上的SetXXX方法

public static void SetRow(UIElement element, int value)
{
if (element == null)
{
throw new ArgumentNullException("element");
}
element.SetValue(Grid.RowProperty, value);
}

你并不需要为你的ABC定义一个Grid.Row属性,而是Grid可以将这个值(也就是2)注入到你的这个ABC类型的控件实例。
[解决办法]
??

最近咋这么多 u010xxxx 滴贴子,怎么csdn也开始流行 组团提问了,呵呵,n年前玩传奇,一个矿洞都是"xx工作室001号矿工",感情这里也流行u010家族了是吧
[解决办法]
引用:
??

最近咋这么多 u010xxxx 滴贴子,怎么csdn也开始流行 组团提问了,呵呵,n年前玩传奇,一个矿洞都是"xx工作室001号矿工",感情这里也流行u010家族了是吧


同感
[解决办法]
我个人的理解是:依赖项属性是对公共语言运行时 (CLR) 属性功能的扩展。
XAML中设置属性: <Button Background="Red" Content="Button!"/>
依赖项属性提供用来扩展属性功能的功能,包括:
资源、数据绑定样式、动画、元数据重写、属性值继承、WPF设计器集成 (具体事例,可阅读msdn)
其中,资源、数据绑定样式应该是比较常见的,反正我平时主要是用这两个功能
说白了,就是属性设置的一种更高级的方法,是一种补充



[解决办法]
准确的说明,还是参考msdn吧:http://msdn.microsoft.com/zh-cn/library/ms753192.aspx
[解决办法]
呵呵,msdn有时候就像是大众菜谱,其实很少人看菜谱而成为高级厨师的。高级的厨师往往对“一把盐、一点点酱”掌握于心,而那些在大众菜谱上则往往都是泛泛而谈。
[解决办法]
引用:
??

最近咋这么多 u010xxxx 滴贴子,怎么csdn也开始流行 组团提问了,呵呵,n年前玩传奇,一个矿洞都是"xx工作室001号矿工",感情这里也流行u010家族了是吧

是csdn的注册搞怪,把会员名隐藏,显示ID,u的意思是uid,后面是ID号。
[解决办法]
依赖
这个中文词读懂没有,读懂了我们就不解释了

如果是弄不明白这就google这几个“AOP 属性注入 解依赖”。虽然说你搜到肯定不是什么WPF资料,但是恰恰解释了你的疑问
[解决办法]
至于你说要什么例子什么体现什么依赖属性的特殊功能,对不起,这个没有。



依赖属性和微软那个asp.net mvc一样只是学人家的东西,他木有啥本质上的特殊功能,他只能说是一种软件方法学,软件工程学的应用
[解决办法]

引用:
我就是想知道,对于上面的代码,依赖项属性不同于普通的.NET属性的特殊功能,在什么地方体现出来了呢?
或者,你可以举个小例子,来说明下依赖项属性的特殊功能

你学会了XAML了么?美工也可以编写过去只有程序员才能编写的许多应用程序。

可能你认为一堆“属性、模板”等等概念对于微软的ide或者wpf/silverlight是“天经地义”的,但是如果你想知道一点例子,其实我已经给你点到了方向。你可以去找更多的依赖属性证据。
[解决办法]
msdn:
引用
依赖项属性的用途在于提供一种方法来基于其他输入的值计算属性值。 这些其他输入可以包括系统属性(如主题和用户首选项)、实时属性确定机制(如数据绑定和动画/演示图板)、重用模板(如资源和样式)或者通过与元素树中其他元素的父子关系来公开的值。 另外,可以通过实现依赖项属性来提供独立验证、默认值、监视其他属性的更改的回调以及可以基于可能的运行时信息来强制指定属性值的系统。 派生类还可以通过重写依赖项属性元数据(而不是重写现有属性的实际实现或者创建新属性)来更改现有属性的某些具体特征。


看见msdn说什么没有,换成大白话就是“如果A的计算依赖与B的输入,那么如何在B更改的同时引发A的变动”,如果A类和B类是独立开发的,按照传统的方法开发,A和B就必须有明确的引用关系和消息通知(或者构造公用上下文对象,通过上下文对象协调管理)。而如果采用依赖项方式,你就可以直接采用注入方式你就可以直接把B类的某个属性挂接到B类的某个属性上---虽然微软内部仍然会有复杂的上下文通知,但是我们这些使用者则很简单


所以,这里不存在什么依赖项属性的非常特殊功能,他没有什么特殊的地方,只是从使用上他比传统的代码要简化很多
[解决办法]
依赖属性是为属性提供一个类型。
比如WPF的动画系列方法,其中一个参数的类型是依赖属性,这样该方法不用关注是要让什么类产生动画,怎么产生动画,这种抽象用传统属性是没法实现的。
[解决办法]
xaml编程中大量使用了binding,把某个控件的属性绑定到其它属性上,虽然支持普通属性的绑定(后台代码不支持普通属性的绑定),但是唯有依赖性属性可以提供双向通知,普通属性可以通过继承INotifyPropertyChanged接口来实现类似功能,一般用在DataGrid的绑定中。
相比通过INotifyPropertyChanged接口提供通知,依赖项属性性能低(有人说性能高,那是错误认识)。除非必要情况,否则别定义实体类的属性为依赖项属性,实体类应该使用INotifyPropertyChanged接口来提供通知。
依赖项属性的实现类似定义一个Dictnary,属性值的添加就是往Dictnary添加的过程,因此如果属性不是全部都用到的情况下,会节省内存消耗,但是实体类是所有属性都会用到,这种情况下使用依赖项属性反而会降低处理速度。而且Dictnary内容增大的同时,查找速度也会减慢,因此依赖项属性只适合用在自定义控件的属性上面,其它场合不适合。
[解决办法]
我已经让你google“AOP 属性注入 解依赖”了

如果你看过就知道在net这块,分静态IL植入,和动态代理两块

你看到的代码是一个故事,实际运行的代码又是另一个故事,语法糖之所以是语法糖的意思是,这是语法上的糖,而不是实际运行的代码

读书人网 >C#

热点推荐