2016-03-20 31 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語法中使用它,因此沒有理由在其他場景中使用它。 –