在C#本身,WPF中是否使用了“附加属性”?
答案 0 :(得分:18)
简短的回答是否定的。稍微长一点的答案是,这是一个不幸的故事。我们为C#4设计了“扩展属性”,当我们意识到,哦,等等,我们设计的东西与WPF风格的属性并不真正兼容时,就实现了(但没有测试)它们。我们最终削减了它,而不是重新设计和重新实现该功能。
更长的版本在这里:
http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx
答案 1 :(得分:2)
AttachedProperties是.NET Framework的一部分,不是C#语言规范的一部分,特别是System.Activities.Presentation.Model命名空间的一部分,它是特定于WPF的。
答案 2 :(得分:2)
在WPF中,附加属性允许您执行以下操作:
<TextBlock Grid.Row="2" Text="I know nothing about grids!" />
这就像将C#中的类定义为:
public class TextBlock
{
public string Text { get; set; }
}
能够做到这一点:
var tb = new TextBlock();
tb.Grid.Row = 2; // this line would not compile
为了完成这项工作,您需要将Grid
对象传递到TextBlock类中:
public class TextBlock
{
public string Text { get; set; }
public Grid Grid { get; set; }
public TextBlock(Grid grid)
{
Grid = grid;
}
}
但我认为没有任何东西直接等同于附加属性在WPF中的工作方式。你需要手工制作它。
你想要完成什么?
答案 3 :(得分:1)
您可以使用ConditionalWeakTable<TKey, TValue>
类将任意状态附加到实例。您可以将它与扩展方法结合使用以创建extension properties的形式,但遗憾的是不使用C#中的nice属性语法。
答案 4 :(得分:-1)
我认为你在考虑吸气剂和吸尘剂。
它们是这样创建的:
public class Person
{
//default constructor
public Person()
{
}
private string _Name;
public string Name
{
//set the person name
set { this._Name = value; }
//get the person name
get { return this._Name; }
}
}
更多关于他们如何在这里工作: http://msdn.microsoft.com/en-us/library/aa287786(v=vs.71).aspx