避免大型交换问题的良好做法

时间:2018-03-15 13:31:28

标签: c# wpf mvvm

大家好

我正在研究使用MVVM设计显示卡片的一些代码。

为了快速,这里是我的代码的一些示例。

这是我的ViewModel:

public sealed class CardViewModel : BindableBase
{
    private int _id;
    public int Id
    {
        get { return _id; }
        set { SetProperty(ref _id, value); }
    }

    public CardViewModel(CardDTO card)
    {
        Id = card.Id;
    }
}

CardDTO是我通过服务电话收到的一些转移对象 这是代码。

public sealed class CardDTO
{
    public int Id { get; set; }
}

在视图中,每张卡根据其ID显示不同的图片 为此,使用转换器。

public sealed CharIdToFillConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var id = (int)value;

        switch(id)
        {
            case 1:
                return new ImageBrush(...);
            case 2:
                return new ImageBrush(...);
            default:
                throw new NotImplementedException();
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

我不喜欢这段代码中的开关 有没有办法,一些好的做法,使它更清洁? 我应该使用多态而不是我的Id属性吗?

感谢

1 个答案:

答案 0 :(得分:0)

由于你的转换是单向的,你可能不需要测试画笔(因为它的逻辑很简单),我认为你想要最好的性能然后触发器是你的朋友。不要过多地依赖转换器,因为它们比触发器慢。 (more information regarding performance issues of converters in WPF

您可以通过在Id上使用DataTrigger或使用多态来实现此目的(每个派生类型都有自己的样式或模板,WPF会根据它尝试可视化的对象类型自动选择正确的样式或模板)