【问题标题】:Specific model for the view with MVVM pattern?具有 MVVM 模式的视图的特定模型?
【发布时间】:2016-03-21 10:21:08
【问题描述】:

假设我想创建一个 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);
        }
    }
}

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

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

提前致谢!

---------------- 更新 -----------------

在按照 Vadim Martynov 的建议查看 IValueConverter 之后,我看到一些人将他们的模型包装起来以处理这些情况。 所以这是我的结论:

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

我说的对吗?

【问题讨论】:

    标签: c# wpf mvvm viewmodel mvvm-light


    【解决方案1】:

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

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

    然后编写新的转换器:

    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

    【讨论】:

    • 非常有用!我知道 IValueConverter,但我没想过以这种方式使用它们。它们是解决每个“查看问题”的方法吗?我的意思是,您永远不应该构建“视图模型”? (顺便说一句,我很抱歉我的英语,正如你所看到的,这不是我的第一语言:p)
    • @Speuline 您永远不应该构建“视图模型”。然后你有模型类,你需要根据数据调整你的视图。视图可以包含平台特定的属性,如可见性、颜色、画笔等。你永远不应该在 ViewModel 或 Model 类中使用它。然后,您需要创建从数据(模型)到视图的转换器,并将数据属性与其转换器绑定。此外,您可以使用数据触发器。在这种情况下,您对模型的看法很熟练,不是吗?
    • @Speuline 我同意,专门为视图创建属性也可能是个坏主意。但是您已经有了一些指示标题级别的值。您可以使用它并为这个已经存在的属性创建转换器。
    • 但是如果我的 ViewModel 中有 50 个属性,并且这些属性中的每一个在视图中都有自己的显示方式,也许最好为视图构建一个辅助类而不是创建 50 个转换器,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2011-10-07
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多