2010-11-19 13 views
34

Solo una breve domanda, per chiarire alcuni dubbi. I setter non vengono eseguiti quando un elemento è associato a una proprietà di dipendenza?I setter non sono in esecuzione sulle proprietà delle dipendenze?

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}" /> 

Come ho notato che il seguito nel mio setter non viene eseguito

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

se si mette un punto di interruzione nel setter è possibile vedere dove viene impostato. – VoodooChild

+4

Se è necessario eseguire il codice quando la proprietà è impostata, guardare CoerceValueCallback o ValueChangedCallback della classe UIMetadata. – Jens

+0

possibile duplicato di [WPF: dichiarazioni di proprietà XAML non impostate tramite setter?] (Http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

risposta

46

Il motore di associazione WPF chiama GetValue e SetValue direttamente (bypassando i setter di proprietà e getter). È necessario che la proprietà sia presente, in modo che possa essere supportata nel markup XAML (e compilare correttamente).

+0

Ciao , Non sono sicuro di capire cosa dici? – Emixam23

+0

@ Emixam23 Dean sta dicendo che l'OP non può inserire un'istruzione debug nella proprietà TextContent per determinare se il DP viene associato o meno correttamente, poiché WPF chiamerà SetValue, non il setter TextContent. – Dave

34

Per creare una proprietà di dipendenza, aggiungere un campo statico di tipo DepDencyProperty al tipo e chiamare DependencyProperty.Register() per creare un'istanza di una proprietà di dipendenza. Il nome di DependendyProperty deve sempre terminare con ... Proprietà. Questa è una convenzione di denominazione in WPF.

Per renderlo accessibile come una normale proprietà .NET è necessario aggiungere un wrapper di proprietà. Questo wrapper non fa altro che ottenere e impostare internamente il valore utilizzando i metodi GetValue() e SetValue() ereditati da DependencyObject e passando DependencyProperty come chiave.

Non aggiungere alcuna logica a queste proprietà, perché vengono chiamate solo quando si imposta la proprietà dal codice. Se si imposta la proprietà da XAML, viene chiamato direttamente il metodo SetValue().

Ogni DependencyProperty fornisce richiamate per notifica di modifiche, valore di coercizione e convalida. Questi callback sono registrati sulla proprietà di dipendenza.

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

+0

mi hai salvato la vita! – j00hi

Problemi correlati