【发布时间】:2014-08-07 09:56:15
【问题描述】:
我刚刚发现我可以做到以下几点:
var button = new Button();
button.SetValue(TextBlock.TextProperty, "text");
var text = (string)button.GetValue(TextBlock.TextProperty); // text is "text"
虽然上面的例子有点不切实际,但它确实表明我可以将常规依赖属性附加到另一个对象上。它不必是附加属性(TextBlock.TextProperty 未在 DependencyProperty.RegisterAttached() 注册。
这暴露了为什么首先会有附加属性的问题?我现在可以看到的唯一区别是我无法在 XAML 中附加常规依赖项属性。但仅此而已。还有其他区别吗?
更新:
为了更清楚起见,以下代码可以正常工作,并且从最终用户的角度来看非常接近附加属性:
public static class AttachedPropertyDeclarer
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text",
typeof(string),
typeof(Button),
new PropertyMetadata(default(string),OnTextChanged));
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// do something when text changed
}
}
...
button.SetValue(AttachedPropertyDeclarer.TextProperty, "text");
var text = (string)button.GetValue(AttachedPropertyDeclarer.TextProperty);
将此与附加属性方式进行比较:
public static class AttachedPropertyDeclarer
{
public static readonly DependencyProperty TextProperty = DependencyProperty.RegisterAttached(
"Text",
typeof(string),
typeof(AttachedPropertyDeclarer),
new PropertyMetadata(default(string),OnTextChanged));
private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// do something when text changed
}
}
这里与附加属性的唯一有效区别是我必须声明类型为Button 的所有者,而在附加属性中它通常是AttachedPropertyDeclarer。但这仅在我需要更改事件处理程序(即OnTextChanged)时才需要完成。
【问题讨论】:
-
示例中的代码有效,因为框架不限制基于属性注册类型的 SetValue 和 GetValue,即。附加的或常规的。其次,依赖对象是一个简单的属性容器,其中 DP 是键,值是您存储的内容。最后设计者不会允许这样的使用,因为存储的将没有任何用处,因为目标依赖对象没有使用存储值的知识/实现。
-
为什么投反对票?如何改进问题?
-
如@pushpraj 所述。例如,它们用于扩展现有框架控件的功能。您在创建自己的自定义控件时使用 DP,而附加的 DP 用于扩展功能。就我个人而言,我更喜欢使用行为,那就是在可能的情况下。看看:msdn.microsoft.com/en-us/library/ff725476(v=expression.40).aspx
标签: wpf dependency-properties attached-properties