2010-04-19 7 views
7

Normalmente, cuando desea que un control de datos se 'actualice', utiliza el evento "PropertyChanged" para indicar a la interfaz que los datos han cambiado detrás de las escenas.WPF Actualización Encuadernación cuando se vincula directamente a DataContext w/Converter

Por ejemplo, usted podría tener un bloque de texto que se une a la DataContext con una propiedad "MostrarTexto"

<TextBlock Text="{Binding Path=DisplayText}"/>

A partir de aquí, si el DataContext genera el evento PropertyChanged con PropertyName "MostrarTexto", entonces el texto de este bloque de texto debería actualizarse (suponiendo que no haya cambiado el Modo de la vinculación).

Sin embargo, tengo una encuadernación más complicada que usa muchas propiedades fuera del contexto de datos para determinar la apariencia final del control. Para lograr esto, me enlace directamente al contexto de datos y uso un convertidor. En este caso, estoy trabajando con una fuente de imagen.

<Image Source="{Binding Converter={StaticResource ImageConverter}}"/>

Como se puede ver, yo uso un {} La unión con ningún camino para unirse directamente a la DataContext, y utilizo un ImageConverter para seleccionar la imagen que estoy buscando. Pero ahora no tengo manera (que yo sepa) de decir que el enlace se actualice. Intenté subir el evento de cambio de propiedad con "." como el nombre de propiedad, que no funcionó.

¿Esto es posible? ¿Debo completar la lógica de conversión en una propiedad a la que pueda vincularse el enlace, o hay una forma de decirle al enlace que actualice (sin actualizar explícitamente el enlace)?

Cualquier ayuda sería muy apreciada. Gracias! -Adam

Respuesta

17

La solución consistió en sumar una propiedad a mi objeto (para ser utilizado como el DataContext) llamado "Auto", que simplemente volvió

public Object Self { get { return this; }}

Luego, en la unión utilicé esta propiedad:

<Image Source="{Binding Path=Self, Converter={StaticResource ImageConverter}}"/>

Entonces cuando llamo

PropertyChanged(this, new PropertyChangedEventArgs("Self"))

funciona como un amuleto.

Gracias a todos.

+0

¡GRACIAS! Estaba enojado buscando esto y estaba a punto de preguntarlo cuando apareció en mis sugerencias – HDD

0

Hmm, no muestra la implementación completa. Pero creo que debería actualizarse, si el valor vinculado a la GUI proporciona el PropertyChanged-Event.

Saludos

+0

El problema es que la fuente de la imagen está vinculada directamente al contexto de datos, no es una propiedad del contexto de datos. El convertidor toma el contexto de datos y devuelve una fuente de imagen. Para aclarar, la actualización ocurre (funciona) si utilizo un enlace que tiene una ruta de acceso a una propiedad del contexto de datos, y luego invoco PropertyChanged para esa propiedad. Sin embargo, necesito el objeto mismo para determinar la imagen (más que solo una propiedad). Gracias. – Adam

+0

pensé mientras escribía eso. Voy a tratar de poner una propiedad en mi objeto llamado "Self" que simplemente se devuelve a sí mismo, y luego llamar a PropertyChanged ("Self"). Voy a dar una oportunidad. – Adam

2

No creo que hay una manera de lograr exactamente lo que necesita con su convertidor de corriente. Como mencionó, podría hacer el cálculo en su ViewModel, o podría cambiar su convertidor a IMulitValueConverter.

En su escenario específico (el convertidor vinculado a una clase ViewModel, y algunas de sus propiedades), me inclino por implementar la lógica en el ViewModel.

Cuestiones relacionadas