El enlace de MSDN que ya ha proporcionado lo dice muy bien:
Este método es utilizado por un componente que mediante programación establece el valor de una de sus propias propiedades sin la desactivación de una aplicación declaró uso de la propiedad. El método SetCurrentValue cambia el valor efectivo de la propiedad, pero activadores existentes, enlaces de datos y estilos continuarán funcionando.
Supongamos que está escribiendo el control TextBox
y has descubierto una Text
propiedad que la gente usa a menudo como sigue:
<TextBox Text="{Binding SomeProperty}"/>
En el código de su control, si se llama a SetValue
va a sobrescribir el enlace con lo que sea que proporciones Si llama al SetCurrentValue
, sin embargo, se asegurará de que la propiedad tome el valor dado, pero no destruirá ninguna vinculación.
Según mi leal saber y entender, los consejos de Greg son incorrectos. Siempre debe usar GetValue
/SetValue
desde su propiedad de contenedor CLR. SetCurrentValue
es más útil en situaciones en las que necesita una propiedad para asumir un valor determinado, pero no desea sobrescribir ningún enlace, disparador o estilo que se haya configurado en su propiedad.
En el blog de 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) puede leer lo siguiente al final. "Para un desarrollador de control, la recomendación general es usar siempre DependencyObject.SetCurrentValue sobre DependencyObject.SetValue en el código de Control. Te darás cuenta de que nuestros controles de stock en el marco 4.0 se han actualizado para usar esta API en lugar de establecer las propiedades con valores locales ". Probablemente ambos tengan razón, pero ¿pueden explicar la diferencia aquí y la recomendación del blog? –
@Meleak: para ser sincero, creo que la publicación es un poco confusa. Creo que quiso decir que 'SetCurrentValue' se debería usar en cualquier lugar de tu control donde quieras * internamente * modificar el valor de una propiedad de dependencia.De hecho, si abre su proyecto de ejemplo, verá que todavía está usando 'GetValue' y' SetValue' en el contenedor de propiedades de CLR. De hecho, si rompe el reflector abierto contra .NET 4.0, verá que ese sigue siendo el caso también. –
Hmm, hasta ahora, he estado usando 'SetValue' como generado por Visual Studio, funciona bien. Realmente no entiendo lo que quieres decir con destruir el encuadernado. ¿Después del primer cambio de valor, mi enlace no se destruye? porque todavía puedo hacer cambios y el enlace todavía funciona? –