2010-11-20 9 views
42

La razón por la que estoy preguntando esto es porque me fue recomendado por @Greg D (desde this question) para usar SetCurrentValue(), pero eche un vistazo a los documentos y no lo haga ver cuál es la diferencia. ¿O qué significa "sin cambiar su fuente de valor"?Cuál es la diferencia entre propiedad de dependencia SetValue() y SetCurrentValue()

SetValue()

establece el valor local de una propiedad de dependencia, especificado por su identificador de propiedad de dependencia.

SetCurrentValue()

establece el valor de una propiedad de dependencia sin cambiar el origen de valor.

Respuesta

46

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.

+2

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? –

+1

@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. –

+2

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? –

2

En relación con la respuesta aceptada:

me encontré con que this post explica SetCurrentValue() bastante bien. Observe cómo el sistema de precedencia del valor de propiedad de dependencia tomará un valor local sobre un valor encuadernado. Lo cual explica el comportamiento inesperado de los comentaristas.

Cuestiones relacionadas