2010-11-19 9 views
34

Nur eine kurze Frage, um einige Zweifel zu klären. Werden Setter nicht ausgeführt, wenn ein Element an eine Abhängigkeitseigenschaft gebunden ist?Setter nicht auf Dependency Properties ausgeführt?

public string TextContent 
{ 
    get { return (string)GetValue(TextContentProperty); } 
    set { SetValue(TextContentProperty, value); Debug.WriteLine("Setting value of TextContent: " + value); } 
} 

public static readonly DependencyProperty TextContentProperty = 
    DependencyProperty.Register("TextContent", typeof(string), typeof(MarkdownEditor), new UIPropertyMetadata("")); 

...

<TextBox Text="{Binding TextContent}" /> 

Wie ich die unten in meine Setter nicht bemerkt

Debug.WriteLine("Setting value of TextContent: " + value); 
+0

, wenn Sie einen Haltepunkt in dem Setter setzen können Sie sehen, wo es eingestellt wird. – VoodooChild

+4

Wenn Sie Code ausführen müssen, wenn die Eigenschaft festgelegt ist, sehen Sie sich CoerceValueCallback oder ValueChangedCallback der UIMetadata-Klasse an. – Jens

+0

mögliche Duplikate von [WPF: XAML-Eigenschaftsdeklarationen werden nicht über Setter gesetzt?] (Http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

Antwort

46

Die WPF Bindungsmodul ruft GetValue und SetValue direkt (unter Umgehung der Eigenschaft Setter läuft und Getters). Sie benötigen die Eigenschaft, um dort zu sein, damit sie im XAML-Markup unterstützt werden kann (und korrekt kompilieren).

+0

Hi Ich bin mir nicht sicher, was du sagst? – Emixam23

+0

@ Emixam23 Dean sagt, dass das OP eine Debug-Anweisung in der TextContent-Eigenschaft nicht festlegen kann, um zu bestimmen, ob das DP ordnungsgemäß gebunden wird, da WPF SetValue und nicht den TextContent-Setter aufrufen wird. – Dave

34

Um eine DependencyProperty zu erstellen, fügen Sie Ihrem Typ ein statisches Feld vom Typ DependencyProperty hinzu und rufen DependencyProperty.Register() auf, um eine Instanz einer Abhängigkeitseigenschaft zu erstellen. Der Name der DependendyProperty muss immer mit ... Eigenschaft enden. Dies ist eine Namenskonvention in WPF.

Um es als normale .NET-Eigenschaft zugänglich zu machen, müssen Sie einen Eigenschaftswrapper hinzufügen. Dieser Wrapper macht nichts anderes als intern den Wert abzurufen und zu setzen, indem er die GetValue() - und SetValue() - Methoden verwendet, die von DependencyObject geerbt wurden, und die DependencyProperty als Schlüssel übergeben.

Fügen Sie diesen Eigenschaften keine Logik hinzu, da sie nur aufgerufen werden, wenn Sie die Eigenschaft aus Code festlegen. Wenn Sie die Eigenschaft von XAML aus festlegen, wird die SetValue() -Methode direkt aufgerufen.

Jede DependencyProperty bietet Callbacks für Änderungsbenachrichtigung, Wertumwandlung und Validierung. Diese Rückrufe werden in der Abhängigkeitseigenschaft registriert.

Quelle: http://www.wpftutorial.net/DependencyProperties.html

+0

Sie haben mein Leben gerettet! – j00hi