在MVVM场景中,View负责显示ViewModel。这对ViewModel来说无关紧要。
现在我想用图像显示某些属性(例如状态)的值(例如类似交通灯的图标)。
我发现的大多数示例都存储了ViewModel属性中不同版本图标的路径。并根据状态进行了更改。然后在视图中应用绑定从图像源到所述属性。
这感觉不对。 ViewModel不应该知道属性的呈现类型。至于ViewModel知道它可以呈现为任何东西(标签,测试,图像,颜色等)。
将ViewModel属性显示为图像/图标的正确MVVM-WPF方法是什么?因此,无需在ViewModel中存储image-path / url。
答案 0 :(得分:2)
正确的方法是在我看来使用转换器。例如,要将状态值转换为图标,请使用VM中的枚举和转换为图标路径。
所以在我们的模型中......
public enum ResultType { Unknown, Good, Bad, Suspect };
public ResultType Type { get; set; }
然后转换器
public class ResultTypeIconConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Result.ResultType)
{
return GetIconPath((Result.ResultType)value);
}
return "Images/glyphicons-195-question-sign.png";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public static string GetIconPath(Result.ResultType rt)
{
switch (rt)
{
case Result.ResultType.Bad:
return "pack://application:,,,/someassembly;component/Images/badresult.png";
case Result.ResultType.Good:
return "pack://application:,,,/someassembly.WPF;component/Images/goodresult.png";
case Result.ResultType.Suspect:
return "pack://application:,,,/someassembly.WPF;component/Images/suspectresult.png";
case Result.ResultType.Unknown:
return "pack://application:,,,/someassembly.WPF;component/Images/unknownresult.png";
default:
return "pack://application:,,,/PetroUtilitiesUI.WPF;component/Images/glyphicons-195-question-sign.png";
}
}
}
XAML资源
<local:ResultTypeIconConverter x:Key="IconConverter"/>
XAML参考
<Image Height="15" Width="15" Source="{Binding Type, Converter={StaticResource IconConverter}}" DockPanel.Dock="Left"/>
所以这很干净。该模型对图标一无所知,视图对枚举一无所知。现在......是VM或视图的类型转换器部分?我把这个问题留给了哲学家。