依赖属性本质上是静态的,所以如果我创建一个名为“IsGrayProperty”的bool类型自定义依赖项属性,并在两个按钮上实现它。 然后,如果我在BTN1设置的值,为什么它不应该反映在BTN2,为的DependencyProperty是静态的,他们是一个.NET包装财产“IsGray”依赖属性机制
依赖属性机制
回答
静态只读DependencyProperty
名为IsGrayProperty
是一个标识符 - 可以这么说,一个关键的价值。它还包含有关该属性的元数据。这不是实际的财产本身。每个DependencyObject
实例在内部都存储自己的DependencyProperty
值。
依赖属性是语义非常像普通的实例属性,但它们有附加功能这让他们做的事情,普通实例属性不能(例如,你可以在运行时经常改变自己的元数据,不像Attributes
属性,并且您可以创建附加属性)。这就是他们存在的原因。
例如,TextBlock.Text
是依赖项属性。
//
// Summary:
// Identifies the System.Windows.Controls.TextBlock.Text dependency property.
//
// Returns:
// The identifier of the System.Windows.Controls.TextBlock.Text dependency property.
[CommonDependencyProperty]
public static readonly DependencyProperty TextProperty;
而且它有一个“常规属性”包装,也:
//
// Summary:
// Gets or sets the text contents of a System.Windows.Controls.TextBlock.
//
// Returns:
// The text contents of this System.Windows.Controls.TextBlock. Note that all
// non-text content is stripped out, resulting in a plain text representation
// of the System.Windows.Controls.TextBlock contents. The default is System.String.Empty.
[Localizability(LocalizationCategory.Text)]
public string Text { get; set; }
当您设置一个TextBlock
的Text
,确实每隔TextBlock
共享相同的文字?不,当然不。如果他们这样做,依赖属性将是完全无用的。
DependencyProperty
参数为GetValue
告诉DependencyObject
哪个值从依赖项对象自己的内部属性值存储中检索;如果值存储在DependencyProperty
本身中,则您将查询DependencyProperty
,而不是的DependencyObject
。
public void ForExample(TextBlock tb)
{
var oldtext = tb.GetValue(TextBlock.TextProperty) as String;
tb.SetValue(TextBlock.TextProperty, "Test value");
}
如果只有一个TextBlock.TextProperty
全球价值,它的存储在TextBlock.TextProperty
,究竟为什么我们呼吁的TextBlock
一些随机的情况下GetValue()
和SetValue()
?为什么要让某个特定的TextBlock
实例进入该行为?
相反,我们会打电话给TextBlock.TextProperty.SetValue()
。
这就像一个解释:
var d1 = new Dictionary<String, Object>();
var d2 = new Dictionary<String, Object>();
var keyValue = "Foo";
d1.Add(keyValue, 32);
Console.WriteLine(d2[keyValue]);
你会从d2[keyValue]
有什么期望?你会期望没有什么,因为你从未给d2
的值为keyValue
。 d1.Add("Foo",32)
不在字符串"Foo"
中存储整数32
。它存储在的字典。
每个词典存储自己的键值。每个DependencyObject
都存储它自己的属性值。在内部,它可能将它们存储在中 a Dictionary
;为什么不?如果。NET团队可以编写比Dictionary
更高效的存储键/值对的方法,他们会称之为Dictionary
。
当您了解语言或框架功能的含义时,请始终问自己:“如果我的想法是真实的,该功能是完全无用的还是大量有害的?”如果这个问题的答案是“是”,那么你猜对功能意味着什么错了。这是100%的保证,因为语言和框架设计师和实施者不会浪费数月的时间来设计完全没用的功能(classes in Perl 5 come close, though)。
感谢埃德,是的你是对的,但没有得到如何一个静态属性可以有不同的控制值不同,虽然GetValue,Setvalue在结束访问静态只读属性 – Raj
这完全等同于从字典中检索项目:'' var foo = new Dictionary
什么是真正静态的,是依赖属性描述:
public static readonly DependencyProperty IsGrayProperty =
DependencyProperty.Register(
"IsGray",
typeof(bool),
typeof(MyButton));
描述符仅包含有关财产的元数据,并且它不包含它的价值。
进行使用的数据绑定和代码访问的实际属性,是实例之一:
public bool IsGray
{
get
{
return (bool)GetValue(IsGrayProperty);
}
set
{
SetValue(IsGrayProperty, value);
}
}
,你可以看到,它代表获取和设置实例方法GetValue
和基础DependencyObject
的SetValue
。
在内部,DependencyObject
维护一个条目数组(在实例字段中),其中存储其依赖项属性的实际值。每个实例都有自己的数组,实际值驻留在其中一个条目中。因此,它永远不会与其他实例共享。因此,SetValue
改变了当前按钮实例的状态,而不是任何静态状态。
静态IsGrayProperty
描述符仅用于确定一个指数到条目数组,执行验证,等等。这一事实IsGrayProperty
是静态的,使得它稍微反直观的考虑,但尽管如此,依赖属性值是每依赖对象的实例,并且不共享。
感谢Felix,通过使用GetValue和SetValue,我正在访问已注册的静态IsGrayproperty,在这种情况下,静态属性将一次只有一个值,因此对于实现的所有控件应该是相同的,发生,我想知道依赖属性实际上是如何工作的 – Raj
不,不,不。通过使用GetValue和SetValue,您可以访问包含条目数组的实例字段,每个实例都是私有的。 IsGrayProperty描述符仅用于确定数组中的索引,执行验证等。由GetValue和SetValue读取和写入的实际值位于条目数组中,且每个实例都有其自己的条目数组。 IsGrayProperty是静态的,这使得它有点反直觉去思考它,但是,依赖属性值是每个实例的,并且不是共享的。 –
- 1. 依赖属性更新机制
- 2. 依赖属性
- 3. 依赖属性
- 4. WPF:CLR属性依赖属性
- 5. 依赖属性空
- 6. 依赖属性WPF
- 7. 依赖属性依赖于另一个
- 8. 不依赖于UserControl的依赖属性
- 9. 绑定依赖属性到另一个依赖属性
- 10. 依赖于其他属性的依赖属性
- 11. Maven:通过属性复制依赖项
- 12. 属性更改依赖属性
- 13. 注册属性作为依赖属性
- 14. 容易依赖项属性
- 15. 依赖属性 - 存储,Grid.Row
- 16. 转换器依赖属性
- 17. 使用依赖项属性
- 18. 链接依赖属性
- 19. 依赖属性困难
- 20. WPF:依赖属性和DataContext
- 21. WPF依赖属性错误
- 22. 清除依赖项属性
- 23. WPF:嵌套依赖属性
- 24. 依赖属性does not trigger
- 25. app.xaml.cs中的依赖属性
- 26. 依赖属性错误
- 27. 简单的依赖属性?
- 28. 手稿依赖属性
- 29. 设置依赖属性
- 30. 依赖属性回调
因为btn2没有引用btn1的属性。 – Adam