日期:2014-05-17  浏览次数:20807 次

WPF,请问依赖项属性
定义依赖项属性的字段,必须是public的,必须是static的,那是否必须是readonly的呢?

下面这个链接中例子,就不是readonly的
http://www.cnblogs.com/xiongpq/archive/2010/06/29/1767905.html

------解决方案--------------------
不需要readonly,但是推荐readonly
------解决方案--------------------
引用:
引用:不需要readonly,但是推荐readonly
如果是readonly,怎么能set呢?

直接在后面=赋值,只允许一次
------解决方案--------------------
引用:
public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", //属性名称
       typeof(string), //属性类型
       typeof(TestDependencyPropertyWindow), /……

DependencyProperty只是声明依赖属性而已,它readonly只是不让TextProperty字段再被修改。
你Text里的Get、Set并没有对TextProperty字段进行修改。
------解决方案--------------------
引用:
引用:引用:public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", //属性名称
       typeof(string), //属性类型
      ……

拜托,对字段进行修改是 TextProperty = XXXX
你这里是SetValue,请问赋值了么?
请你去了解一下依赖属性的值保存在哪里吧
------解决方案--------------------
关键在于楼主没有理解ReadOnly的用法。
------解决方案--------------------
呵呵。SerValue是以TextProperty这个变量(的值)为索引去修改别的东西,并不是修改TextProperty所指向的对象本身。类似于
Dictionary<DependencyProperty,object> dic= new .......;
dic[TextProperty] = value;


当然Dependency数据库机制要比这个Dictionary<DepandencyProperty,object> 要复杂,例如这个SetValue方法就检测TextProperty 上的定义,来判断value是不是string类型。

无论如何,TextProperty 类型跟string毫无关系。怎样也不能生硬地把一个sting看成是在修改一个DependencayProperty的属性,更不是在给 TextProperty 变量赋值。
------解决方案--------------------
比如说如果你突然发现原来的定义不对,需要修改
public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", //属性名称
       typeof(System.Windows.Media.Color), //属性类型
       typeof(TestDependencyPropertyWindow), //该属性所有者,即将该属性注册到那个类上
       new PropertyMetadata("")); //属性默认值
        
public System.Windows.Media.Color Text
 {
    get { return (string)GetValue(TextProperty); }
    set { SetValue(TextProperty, value); }
 }

那么也就立刻改变了。因为这个TextProperty 本身,你只是声明了属性的类型,它创建一个名片(用来提供SeValue方法去作为索引查找依据),而并不包含值。
------解决方案--------------------
引用:
再请问,readonly是加好呢,还是不加呢

加,防止被更改