关闭。这个问题是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/