2016-03-20 16 views
0

Ich habe zwei Implementierungen von Abhängigkeitseigenschaften in WPF. Erstens, dass ich in Internet gefunden:Unterschied zwischen Abhängigkeitseigenschaften in 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)) 
     } 
    } 
} 

Und zweitens von propdp Schnipsel:

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

Was ist der Unterschied zwischen ihnen? Was soll ich verwenden?

+1

Die erste ist keine Abhängigkeitseigenschaft. Lesen Sie den Artikel [Abhängigkeitseigenschaften - Übersicht] (https://msdn.microsoft.com/de-de/library/ms752914 (v = vs.100) .aspx) auf MSDN für alle Details, insbesondere für die Unterschiede zu normalen Eigenschaften . – Clemens

Antwort

2

Sie können an den Wert DependencyProperty einen Wert binden, der INotifyPropertyChanged implementieren kann. Wenn Sie beispielsweise Folgendes schreiben:

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

dann ist Content eine Abhängigkeitseigenschaft, die auf die Änderung der Bindungsquelle reagiert.

Der wichtigste Unterschied ist, dass der Wert eines normalen .NET Eigenschaft direkt von einem privaten Mitglied in der Klasse lesen ist, während der Wert eines DependencyProperty dynamisch aufgelöst wird, wenn die GetValue() Methode aufrufen das wird von DependencyObject geerbt.

Wenn Sie einen Wert einer Abhängigkeitseigenschaft festlegen, wird er nicht in einem -Feld Ihres Objekts gespeichert, sondern in einem von der Basisklasse DependencyObject angegebenen Schlüssel- und Wertewörterbuch . Der Schlüssel eines Eintrags ist der Name der Eigenschaft und der Wert ist der Wert, den Sie festlegen möchten.

via

Sie sollten in Ihrem Viewmodel einfache Eigenschaften verwenden, die Sie zu den Abhängigkeitseigenschaften in WPF-Objekten binden werden (Content, Background, IsChecked und viele andere DP enthalten, die Sie in Ihrem benutzerdefinierten Benutzer definieren Kontrollen).

+0

Also, in meinem ViewModels sollte ich einfache Eigenschaften verwenden. Aber brauche ich OnPropertyChanged für sie, wie im ersten Beispiel? Verstehe ich richtig, diese Abhängigkeitseigenschaft, die nur in Ihren benutzerdefinierten Steuerelementen verwendet wird, wie benutzerdefiniertes Textfeld, Bild usw.? –

+0

Wenn Sie Datenbindung verwenden möchten und eine Reaktion in Ihrer UI haben, wenn sich die Eigenschaft ändert, dann müssen Sie INPC implementieren und das PropertyChanged-Ereignis bei Wertänderung (wie in Ihrem Beispiel) auslösen. Und ja Abhängigkeitseigenschaften erlauben, es in XAML-Syntax zu verwenden, dann gibt es keinen Grund, es in anderen Szenarien zu verwenden. –

Verwandte Themen