2009-10-27 17 views
6

Estoy usando WPF y el patrón MVVM en mi interfaz de usuario. En mi ViewModel tengo una lista que contiene distancias en milímetros, que se muestran en un ListView vinculando ListView.ItemsSource a la lista. Sin embargo, me gustaría que los valores mostrados utilicen una unidad más natural, ya sea metros o pies, dependiendo del estado de una casilla de verificación "métrica".WPF y MVVM: cambio del convertidor de enlace de datos en tiempo de ejecución

He escrito un par de clases simples, MillimetresToMetresConverter y MillimetresToFeetConverter, las cuales implementan IValueConverter. Aunque puedo establecer la propiedad Convertidor en mi enlace de datos a uno u otro, no estoy seguro de cómo cambiar entre estos convertidores cuando cambia el estado de la casilla de verificación.

Mi plan era tener un campo "IValueConverter lengthConverter" en mi modelo de vista que podría fijar a un convertidor o el otro, entonces en mi XAML hacer ...="{Binding Converter={Binding Path=lengthConverter}}" - lamentablemente esto no funciona ya Converter no es una propiedad de dependencia.

¿Cómo se puede cambiar el convertidor utilizado por el enlace de datos en el tiempo de ejecución?

+0

Debería poder usar DependencyObject.GetBinding (DependencyProperty), p. Ej. myTextBlock.GetBinding (TextBlock.TextProperty) para obtener (y modificar) el objeto de enlace. – Heinzi

+0

Desafortunadamente, siguiendo el patrón MVVM significa que el código tendría que vivir en el modelo de vista - que no tiene ninguna referencia a la vista y por lo tanto no se puede tocar "myTextBlock". – user200783

Respuesta

0

Si puedo sugerir una solución alternativa simple: Cree un pequeño FormatMillimetresConverter en su ViewModel, cuya propiedad UseMetric está vinculada a la casilla "métrica".

+0

Gracias, pero una vez que tengo un FormatMillimetresConverter en ViewModel, ¿cómo obtengo el ListView para usarlo? – user200783

+0

Buen punto. :-) Puedes exportar una instancia de la misma como propiedad estática de tu ViewModel y luego acceder a ella a través de "... Converter = {x: Static local: ViewModel.MyFormatMillimetresConverter}", pero de alguna manera eso no es muy elegante ... – Heinzi

+0

¿Qué hay de la creación de FormatMillimetresConverter en ? Entonces es disponible como un recurso estático y se puede adjuntarlo como un convertidor a la ListView.ItemsSource con "... Convertidor = {StaticResource ..." y la casilla de verificación con '{Binding Fuente = {StaticResource ...'. – Heinzi

5

La mayoría de las veces, al utilizar la metodología MVVM, puede realizar la tarea de formateo en las clases de VM. En su caso, podría agregar una propiedad Format a la clase VM y, en función del valor de la propiedad Format, devolver una cadena bien formateada.

Consulte this discussion para obtener más información.

+0

Exactamente. Los convertidores son muy raros en una aplicación MVVM, normalmente solo aparecen en controles personalizados. –

+0

Supongamos que mi modelo de vista tiene un 'Lista propiedad Distances' que estoy Encuadernación mi ListView.ItemsSource a. ¿Está sugiriendo que en lugar de Distances.get devuelva la lista tal como está, debería devolver una lista diferente, con la conversión ya aplicada? – user200783

+0

@Paul: sip. Un ViewModel es solo un poco ValueConverter ;-). Puede leer una discusión similar en el foro de discusión Discípulos de WPF: http://groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e –

Cuestiones relacionadas