65.9K
CodeProject 正在变化。 阅读更多。
Home

如何实现一个依赖属性?

2009年9月8日

CPOL

1分钟阅读

viewsIcon

143174

依赖属性的设置是为了使声明式代码能够改变对象的属性,从而通过提供一种关于数据变化的更强大的通知系统,以非常具体的方式减少数据需求。

依赖属性的设置是为了使声明式代码能够改变对象的属性,从而通过提供一种关于数据变化的更强大的通知系统,以非常具体的方式减少数据需求。在 .NET 中,有两种类型的属性:普通属性和依赖属性,后者在普通属性的基础上增加了功能。

现在,让我们讨论如何实现这样一个依赖属性,以便在数据变化时提供强大的通知。

首先,从 INotifyPropertyChanged 接口实现 UserControl 类。

public partial class MyUserControl : UserControl, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
        if (PropertyChanged != null) 
        { 
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
        } 
    } 
}

创建你自己的普通属性。 假设属性的名称是“Caption”。

public string Caption 
{  
    get { return GetValue(CaptionProperty).ToString(); }  
    set { SetValue(CaptionProperty, value); } 
}

现在,通过调用 Register 方法,并传递你在上一步中用于存储数据的属性字段,将 DependencyProperty 注册到 CLR。

public static readonly DependencyProperty CaptionProperty = 
  DependencyProperty.Register("Caption", typeof(string), typeof(MyUserControl), 
  new PropertyMetadata(string.Empty, OnCaptionPropertyChanged));

DependencyProperty 的标识符字段的名称将与你在属性中使用的名称相同,并在末尾附加“Property”。 在这个例子中,我们的属性名称是“Caption”,因此我们的标识符字段名称是“CaptionProperty”。 在 Register 方法中添加 PropertyMetaData,包含默认值和回调事件处理程序,如上述代码所示。 将标识符标记为 staticreadonly,以便它对 CLR 来说是唯一的。

现在,实现 OnCaptionPropertyChanged 事件处理程序。

private static void OnCaptionPropertyChanged(DependencyObject dependencyObject, 
               DependencyPropertyChangedEventArgs e) 
{  
    MyUserControl myUserControl = dependencyObject as MyUserControl;  
    myUserControl.OnPropertyChanged("Caption");  
    myUserControl.OnCaptionPropertyChanged(e); 
}
private void OnCaptionPropertyChanged(DependencyPropertyChangedEventArgs e) 
{ 
    txbCaption.Text = Caption; 
}

依赖属性的实现已经完成。 你可以从 XAML 调用它

<local:MyUserControl Caption="My First Dependency Property Example" />

或者从代码隐藏文件调用它。

MyUserControl myUserControl = new MyUserControl(); 
myUserControl.SetValue(MyUserControl.CaptionProperty, 
              "My First Dependency Property Example");
© . All rights reserved.