Por el momento, traduzco el número en un pincel en el modelo de vista para mantener solo la vista XAML, pero ¿es así?
No, realmente no.
Idealmente, debe mantener las dependencias de WPF fuera de su ViewModel. Esto ayuda a permitir que su aplicación sea más comprobable, pero también fácilmente traducible a Silverlight u otras tecnologías en el futuro.
WPF proporciona un mecanismo para este escenario exacto, sin embargo: IValueConverter. Es muy fácil hacer un ValueConverter que convierte la traducción de un entero, cadena o cualquier otro tipo en un pincel. El Data Binding Overview muestra un ejemplo de traducción de un Color a un Pincel usando un Convertidor de valores.
Este es un diseño mucho mejor a largo plazo ... "Pinceles" y otros conceptos de WPF son realmente parte de la Vista, no están ligados a su lógica. Su ViewModel debe pensar en términos del estado , y su vista debe traducir ese estado a una forma específica de representar el estado.
Supongamos que quiere utilizar un pincel "rojo" para mostrar un error. En lugar de que ViewModel exponga un pincel, debería exponer algunas primitivas (es decir, una propiedad bool) como IsInErrorState
. La Vista debería decidir cómo representar esto, ya sea a través de un pincel rojo, una gran advertencia, etc. Los convertidores permiten que esto suceda de una manera puramente XAML.
En su caso, el ValueConverter es fácil. Como va desde un Número -> Pincel (aunque recomendaría usar un Enum personalizado en lugar de un int), puede hacer algo como:
[ValueConversion(typeof(int), typeof(SolidColorBrush))]
public class IntToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
int option = (int)value;
switch(option)
{
default:
return Brushes.Black;
case 1:
return Brushes.Red;
case 2:
return Brushes.Green;
// ...
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
// No need to convert back in this case
throw new NotImplementedException();
}
}
Pensando en esto más, estoy de acuerdo contigo. Ciertamente, algo como un Pincel no debe exponerse, porque un diseñador puede tener diferentes ideas sobre cómo se debe visualizar un estado en particular. Este es el tema más fundamental: exponer código específico de WPF generalmente significa que estaría exponiendo algunos detalles de la visualización, en lugar de un detalle del estado que debe visualizarse. Una máquina virtual está estrechamente acoplada a su vista, pero las responsabilidades aún deben estar claramente separadas. –
Gracias Reed, justo lo que estaba buscando. – Surfbutler