具有MVVM模式的视图的特定模型?

时间:2016-03-21 10:21:09

标签: c# wpf mvvm viewmodel mvvm-light

假设我想创建一个WPF表单。 在这种形式中,有一堆标题和副标题。 这些标题和副标题使用相同的控件进行演示。 该控件只是顶部分隔符和底部分隔符之间的标签。 标题必须有两个分隔符,副标题必须只有底部分隔符。 此控件中有一个布尔依赖属性。如果设置为true,则会有一个顶部分隔符。

可以在模型中为每个标题/副标题绑定此属性吗?

public class MyModelObject : ViewModelBase
{
    private string _labelName;
    public string LabelName 
    {
        get
        {
         return _labelName;
        }
        set
        {
            _labelName=value;
            RaisePropertieChanged(()=>LabelName);
        }
    }

    private bool _topSeparator;
    public bool TopSeparator 
    {
        get
        {
         return _topSeparator;
        }
        set
        {
            _topSeparator=value;
            RaisePropertieChanged(()=>TopSeparator);
        }
    }
}

我不喜欢它......因为模型应该没有关于视图的信息。但是有一种干净的方法吗?

我正在考虑视图的特定模型......但我不确定。

提前致谢!

---------------- UPDATE -----------------

在看到Valim Martynov建议的IValueConverter之后,我看到一些人用他们的模型来处理这些情况。 所以这是我的结论:

  • 当有一个或两个视图特定属性时,只需创建一个或两个特定的IValueConverter
  • 当有多个视图特定属性时,最好制作一个包装器(看一下这篇文章:Binding Model properties directly in View

我是对的吗?

1 个答案:

答案 0 :(得分:1)

您应该使用IValueConverter绑定实际数据,而不是为视图创建合成属性。

例如,您可以拥有包含TitleTypeTitleSubtitle元素的Text枚举。

然后写新转换器:

public class TitleTypeToSeparatorVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var titleType = (TitleType) value;
        switch(titleType)
        {
            case TitleType.Title:
                // return some value
            case TitleType.Subtitle:
                // return some another one value
            default:
                // handle this scenario
        }
    }
}

Read more about IValueConverter