2009-07-12 21 views
12

Tengo un IValueConverter cuyo trabajo es convertir un BlockId en una etiqueta de condición. El problema es que mi objeto Modelo es lo que tiene la inteligencia para hacer la conversión real. Mi código es el siguiente hasta el momento ...¿Cómo se pasan datos a un IValueConverter en XAML?

public class BlockIdToConditionLabelConverter : IValueConverter 
{ 
    private Model _model; 

    public BlockIdToConditionLabelConverter(Model model) 
    { 
     _model = model; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     int blockId = (int)value; 
     return _model.BlockIdToConditionLabel(blockId); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return Binding.DoNothing; 
    } 
} 

Por el momento, creo un recurso estático en un ResourceDictionary como esto (y más tarde se refieren a ella en un DataTemplate):

<local:BlockIdToConditionLabelConverter 
    x:Key="_blockIdToConditionLabelConverter" /> 

El El problema es que necesito una forma de pasar mi objeto Model a este convertidor. ¿Como podría hacerlo?

Gracias.

Respuesta

7

Este es un problema clásico con los convertidores de valores.

Si está utilizando el patrón MVVM, puede resolver ese problema implementando la conversión dentro del modelo de vista de su modelo.

Si no, puedes echar un vistazo a this post on MSDN forums. (respuesta de Sam Bent - MSFT)

El objetivo es utilizar multibinding para pasar el modelo a su convertidor, en este caso, pasar el DataContext.

+0

Bueno, ahora me tienes leyendo en MVVM :) Podría tener mucho sentido para mí comenzar a usarlo, porque me estaba encontrando exactamente con el problema que el patrón parece querer resolver: ¿Dónde pongo mi convertidor? ¿lógica? Todavía no he leído lo suficiente como para entender lo que quiere decir con "implementar la conversión dentro de ViewModel de su modelo". ¿Esto significa que no uso IValueConverters en absoluto? ¿O simplemente que ViewModel (en lugar del marcado XAML) tiene la tarea de crear instancias de ellos? ¡Gracias! – devuxer

+1

No estoy seguro de cómo se implementa su clase de modelo. En MVVM, en lugar de tener el modelo como su DataContext en WPF, tendría ViewModel como su DataContext. Supongo que originalmente vinculaba la propiedad BlockId de su modelo. Su ViewModel tendría una propiedad ConditionLabel, que vincularía en lugar de BlockId. Esta propiedad haría la conversión dentro del getter. Su ViewModel se registraría en PropertyChanged de su modelo, por lo que puede RaisePropertyChange ("ConditionLabel") en su ViewModel. – decasteljau

+0

He leído más sobre MVVM, así que esto está comenzando a tener sentido. Podría simplemente almacenar los datos convertidos en mi ViewModel y eliminar completamente IValueConverters. Una pega, sin embargo, es que estaba planeando utilizar este IValueConverter con un GridView, por lo que tendría que almacenar una tabla completa de datos convertidos en mi ViewModel (no solo una sola propiedad). ¿Un IValueConverter todavía tendría sentido para eso? ¿Y qué pasa si quiero convertir todas las celdas de GridView donde el Bloque está completo gris claro? Incluso si almacenara una tabla "IsComplete" en ViewModel, igual tendría que convertirla en un color. – devuxer

Cuestiones relacionadas