2016-03-20 83 views
0

我在WPF中有两个依赖项属性的实现。 首先,我在互联网上找到:WPF中依赖项属性之间的区别

public class TestClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    private string _test; 

    public string Test 
    { 
     get 
     { 
      return _test; 
     } 
     set 
     { 
      _test = value; 
      OnPropertyChanged(nameof(Test)) 
     } 
    } 
} 

其次,从propdp片段:

public class TestClass 
{ 
    public string Test 
    { 
     get { return (string)GetValue(TestProperty); } 
     set { SetValue(TestProperty, value); } 
    } 
    public static readonly DependencyProperty TestProperty =  
     DependencyProperty.Register("Test", 
     typeof(string), 
     typeof(TestClass), 
     new PropertyMetadata(string.Empty)); 
} 

它们之间有什么区别?我应该使用什么?

+1

第一个不是依赖属性。请阅读MSDN上的[依赖属性概述](https://msdn.microsoft.com/zh-cn/library/ms752914(v = vs.100).aspx)文章中的所有详细信息,特别是与普通属性的区别。 – Clemens

回答

2

你可以绑定到DependencyProperty某些值可以实现INotifyPropertyChanged。例如,如果你写:

<TextBox Content="{Binding FirstName}" /> 

然后内容是一个依赖性属性,它将对绑定源的变化做出反应。

的主要区别是,该正常的.NET属性的值是 直接从你的类的私有成员读,而调用 的GetValue()方法时DependencyProperty的值 是动态解析它是从DependencyObject继承而来的。

设置依赖属性的值时,它不会存储在对象的 字段中,而是存储在基类DependencyObject提供的键和值为 的字典中。条目的关键是 该属性的名称,该值是您要设置的值。

via

你应该用你的ViewModels简单的属性,你会绑定到依赖属性在WPF对象(ContentBackgroundIsChecked和许多其他包括DP,你会在你的自定义用户定义控制)。

+0

所以,在我的ViewModels中,我应该使用简单的属性。但是,我需要OnPropertyChanged为他们,像第一个例子?我理解是否正确,依赖项属性只用于自定义控件中,如自定义文本框,图像等? –

+0

如果你想要使用数据绑定,当你的用户界面在属性发生变化时有反应,那么你需要实现INPC并在值改变时引发ProprtyChanged事件(如你的例子)。 而且依赖项属性允许在XAML语法中使用它,因此没有理由在其他场景中使用它。 –