2010-11-20 11 views
42

Il motivo per cui lo sto chiedendo è perché mi è stato consigliato da @Greg D (da this question) per utilizzare SetCurrentValue() invece, ma uno sguardo ai documenti e non ha fatto vedere qual è la differenza? O cosa significa "senza cambiare la sua fonte di valore"?Qual è la differenza tra Dependency Property SetValue() e SetCurrentValue()

SetValue()

Imposta il valore locale di una proprietà di dipendenza, specificata dal relativo identificatore proprietà di dipendenza.

SetCurrentValue()

imposta il valore di una proprietà di dipendenza senza modificare l'origine del valore.

risposta

46

Il collegamento MSDN che hai fornito lo dice molto bene:

Questo metodo viene utilizzato da un componente che imposta di programmazione il valore di una delle sue proprietà, senza disabilitazione di un'applicazione dichiarato uso del proprietà. Il metodo SetCurrentValue modifica il valore effettivo della proprietà , ma i trigger esistenti, i binding di dati e gli stili continueranno a funzionare.

Supponiamo che si sta scrivendo il controllo TextBox e hai esposto una proprietà Text che le persone spesso usano come segue:

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

Nel codice del controllo, se si chiama SetValue si sovrascrivere il legame con qualunque cosa tu fornisca. Se si chiama SetCurrentValue, tuttavia, si accerterà che la proprietà assuma il valore dato, ma non distruggerà alcun binding.

Per quanto ne so, il consiglio di Greg non è corretto. È sempre necessario utilizzare GetValue/SetValue dalla proprietà del wrapper CLR. SetCurrentValue è più utile in scenari in cui è necessario che una proprietà assuma un determinato valore ma non si desideri sovrascrivere alcun binding, trigger o stile che sono stati configurati rispetto alla proprietà.

+2

Nel blog di Vincent Sibal (http://blogs.msdn.com/b/vinsibal/archive/2009/05/21/the-control-local-values-bug-solution-and-new-wpf-4- 0-related-apis.aspx) alla fine puoi leggere quanto segue. "Per uno sviluppatore di controlli, la raccomandazione generale è di utilizzare sempre DependencyObject.SetCurrentValue su DependencyObject.SetValue nel codice di controllo. Si noterà che i nostri controlli di magazzino nel framework 4.0 sono stati tutti aggiornati per utilizzare questa API invece di impostare le proprietà con valori locali. " Probabilmente hai ragione entrambi, ma puoi spiegare la differenza qui e la raccomandazione dal blog? –

+1

@Meleak: ad essere onesti, penso che il post sia un po 'oscuro. Penso che intendesse dire che 'SetCurrentValue' dovrebbe essere usato ovunque nel tuo controllo dove vuoi * internamente * modificare il valore di una proprietà di dipendenza.Infatti, se apri il suo progetto di esempio, vedrai che sta ancora usando 'GetValue' e' SetValue' nel wrapper della proprietà CLR. In effetti, se crei un reflector aperto su .NET 4.0, vedrai che è ancora così. –

+2

Hmm, finora, ho usato 'SetValue' come generato da Visual Studio, funziona perfettamente. Non capisco davvero cosa intendi distruggendo la rilegatura. Dopo il 1 ° cambio di valore, il mio binding non viene distrutto? cos posso ancora apportare modifiche e il binding funziona ancora? –

2

A seguito della risposta accettata:

ho scoperto che this post spiega SetCurrentValue() abbastanza bene. Si noti come il sistema Precedence Value Precedence prenderà un valore locale su un valore associato. Che spiega il comportamento inaspettato dei commentatori.

Problemi correlati