Dependency Property系统如何知道特定依赖属性值属于哪个对象实例

时间:2016-05-03 08:26:24

标签: .net wpf dependency-properties

我是WPF的新手,看看this文章。我相信我问的是一个非常基本的问题,但无法找到答案。至少在正确方向上的推动将深受赞赏。 我创建了一个wpf应用程序,然后按如下方式派生了一个TextBox类,并在其上定义了一个依赖项对象。

public class TextBoxEx : TextBox
{
    public string SecurityId
    {
        get
        {
            return (string)GetValue(SecurityIdProperty);
        }
        set
        {
            SetValue(SecurityIdProperty, value);
        }
    }

    public static readonly DependencyProperty
        SecurityIdProperty = DependencyProperty.Register("SecurityId",
        typeof(string), typeof(TextBoxEx),
        new PropertyMetadata(""));
}

在窗口构造函数中,我看到了这一点。

public MainWindow()
{
    InitializeComponent();

    TextBoxEx t1 = new TextBoxEx();
    t1.SecurityId = "abc";

    TextBoxEx t2 = new TextBoxEx();
    var secId = t2.SecurityId;

}   

我看到从t2.SecurityId分配的secId是"",而我希望它是" abc"。

那么WPF依赖属性系统如何知道依赖属性值属于哪个对象实例?我看不到this参数传递给dp属性系统,所以它怎么知道?

2 个答案:

答案 0 :(得分:1)

我认为神奇的是GetValue的实现,它有点复杂:http://www.abhisheksur.com/2011/07/internals-of-dependency-property-in-wpf.html

答案 1 :(得分:1)

SecurityId是一个实例(即非静态)属性,它调用实例方法DependencyObject.GetValue()DependencyObject.SetValue()

如果你想在某个地方看到this关键字,你可以写下这样的属性:

public string SecurityId
{
    get { return (string)this.GetValue(SecurityIdProperty); }
    set { this.SetValue(SecurityIdProperty, value); }
}