В настоящий момент я перевожу число в кисть в ViewModel, чтобы сохранить только XAML-представление View, но так ли это?
Нет, не совсем.
В идеале вы должны хранить зависимости WPF от вашей ViewModel.Это позволяет сделать ваше приложение более тестируемым, но в будущем легко переносимым на Silverlight или другие технологии.
Однако WPF предоставляет механизм для этого точного сценария: IValueConverter .Очень легко создать ValueConverter, который выполняет перевод целого числа, строки или любого другого типа в кисть. Обзор привязки данных показывает пример перевода цвета в кисть с помощью преобразователя значений.
Это гораздо лучший дизайн в долгосрочной перспективе ... "Кисти" и другиеКонцепции WPF действительно являются частью View - они не привязаны к вашей логике.Ваша ViewModel должна мыслить в терминах состояния , а ваш View должен переводить это состояние в определенный способ представления состояния.
Скажем, вы хотите использовать «красную» кисть для отображенияошибка.Вместо того, чтобы ViewModel выставлял кисть, он должен предоставлять некоторый примитив (то есть свойство bool), такой как IsInErrorState
.Представление должно решить, как это представить - будь то с помощью красной кисти, большого предупреждения и т. Д. Преобразователи позволяют этому происходить чисто в XAML-стиле.
В вашем случаеValueConverter это просто.Так как вы переходите от Number -> Brush (хотя я бы рекомендовал использовать пользовательский Enum вместо int), вы можете просто сделать что-то вроде:
[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();
}
}