简体   繁体   中英

Is there attached property in C# itself?

在C#本身,WPF中是否有类似“附加属性”的东西?

The short answer is no. The slightly longer answer is that this is a bit of an unfortunate story. We designed "extension properties" for C# 4 and got as far as implementing (but not testing) them when we realized, oh, wait, the thing we designed is not really compatible with WPF-style properties. Rather than redesign and reimplement the feature we ended up cutting it.

The even longer version is here:

http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx

AttachedProperties是.NET Framework的一部分,不是C#语言规范的一部分,特别是System.Activities.Presentation.Model命名空间的一部分,它是WPF特定的。

In WPF, an attached property allows you to do something like:

<TextBlock Grid.Row="2" Text="I know nothing about grids!" />

This would be like having a class in C# defined as:

public class TextBlock
{
    public string Text { get; set; }
}

And being able to do this:

var tb = new TextBlock();
tb.Grid.Row = 2; // this line would not compile

In order to make this work, you'd need to pass a Grid object into your TextBlock class:

public class TextBlock
{
    public string Text { get; set; }
    public Grid Grid { get; set; }

    public TextBlock(Grid grid)
    {
        Grid = grid;
    }
}

But I don't think there's anything directly equivalent to the way attached properties work in WPF. You'd need to build it by hand.

What are you trying to accomplish?

You can use the ConditionalWeakTable<TKey, TValue> class to attach arbitrary state to an instance. You can combine it with extension methods to create a form of extension properties , but unfortunately without using the nice property syntax in C#.

I think you're thinking of getters and setters.

They are created like this:

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; }
    }
}

More on how they work here: http://msdn.microsoft.com/en-us/library/aa287786(v=vs.71).aspx

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM