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à.
fonte
2010-11-20 11:01:18
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? –
@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ì. –
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? –