C#本身附有财产吗?

时间:2011-06-23 23:36:20

标签: c# wpf

在C#本身,WPF中是否使用了“附加属性”?

5 个答案:

答案 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