c# - 图像路径是否应该使用 MVVM 存储在 VM 中

标签 c# wpf mvvm

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

4年前关闭。




Improve this question




在 MVVM 场景中,View 负责显示 ViewModel。对 ViewModel 来说,如何做到这一点并不重要。

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

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

这感觉不对。 ViewModel 不应该知道属性的渲染类型。据 ViewModel 所知,它可以呈现为任何事物(标签、测试、图像、颜色等)。

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

最佳答案

在我看来,正确的方法是使用转换器。例如,要将状态值转换为图标,请使用 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"/>

所以这是非常干净的。模型对图标一无所知, View 对枚举一无所知。现在......是虚拟机或 View 的类型转换器的一部分吗?我把这个问题留给哲学家。

关于c# - 图像路径是否应该使用 MVVM 存储在 VM 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45514038/

相关文章:

c# - 将数组解包到方法参数中

c# - MVVM : RaisePropertyChange on another item in the same list

wpf - WPF与PRISM 4.0和Unity的工作示例

c# - GridView 不订阅 CollectionChanged 事件

c# - 在不添加私有(private)变量的情况下引发 propertychanged 事件

c# - 为什么 C++ 中的 Visual Studio 不如 C# 中的智能?

c# - 查找打印机的默认双面打印选项

c# - 反序列化 Json 对象 - DateTime

wpf - 如何通过WPF中的代码转到flowdocument阅读器中的特定页码?

c# - 连接 2 个变量的 Getter Only 属性上的 DataBinding