是否应将映像路径存储在具有MVVM

时间:2017-08-04 19:17:27

标签: c# wpf mvvm

在MVVM场景中,View负责显示ViewModel。这对ViewModel来说无关紧要。

现在我想用图像显示某些属性(例如状态)的值(例如类似交通灯的图标)。

我发现的大多数示例都存储了ViewModel属性中不同版本图标的路径。并根据状态进行了更改。然后在视图中应用绑定从图像源到所述属性。

这感觉不对。 ViewModel不应该知道属性的呈现类型。至于ViewModel知道它可以呈现为任何东西(标签,测试,图像,颜色等)。

将ViewModel属性显示为图像/图标的正确MVVM-WPF方法是什么?因此,无需在ViewModel中存储image-path / url。

1 个答案:

答案 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或视图的类型转换器部分?我把这个问题留给了哲学家。