2016-03-21 128 views
0

假设我想创建一个WPF表单。 在这种形式下,有一堆标题和字幕。 这些标题和副标题使用相同的控件进行演示。 此控件只是顶部分隔符和底部分隔符之间的标签。 标题必须有分隔符,字幕只能有底部分隔符。 这个控件有一个布尔依赖性特性。如果它设置为true,则有一个顶部分隔符。MVVM模式视图的特定模型?

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

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 -----------------

看的IValueConverter因为瓦迪姆·马丁诺夫建议后,我看到一些人用他们的模型来处理这些情况。 所以这是我的结论:

  • 当有一个或两个视图特定的属性,只要一两个特定的IValueConverter
  • 如果有多个视图特定的属性,最好做一个包装(有一个看看这篇文章:Binding Model properties directly in View

对吗?

回答

1

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

例如,您可以有TitleType枚举,其中包含Title,SubtitleText元素。

然后写入新的转换器:

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

+0

非常有用的!我知道IValueConverter,但我没有想到这样使用它们。他们是否为每个“查看问题”去?我的意思是,你永远不应该建立一个“视图模型”? (顺便说一句,我很抱歉我的英语,你可以看到,这不是我的第一语言:p) – Speuline

+1

@Speuline你永远不应该建立一个“视图模型”。然后你有模型类,你需要调整你的视图的数据。视图可以包含平台特定的属性,如Visibiliity,Color,Brush和其他。你不应该在ViewModel或Model类中使用它。然后,您需要创建从数据(模型)到视图的转换器,并使用其转换器绑定数据属性。 另外,您可以使用数据触发器。 你很熟练地理解你的模型,不是吗? –

+1

@Speuline也可能是一个坏主意,特别是为视图创建属性,我同意。但是你已经有了一些指示标题级别的值。您可以使用它并为此已有的属性创建转换器。 –