【问题标题】:MVVM design pattern relation between ViewModel and Model [duplicate]ViewModel和Model之间的MVVM设计模式关系[重复]
【发布时间】:2018-06-03 12:25:30
【问题描述】:

根据MSDN上的图片

似乎所有数据和业务逻辑都应该在模型内部,其中视图模型应该具有模型的一组重复属性以用于显示目的。并且 View 应该绑定到 ViewModel 内的重复属性,而不是直接绑定到 Models 内的属性。

ViewModel 应该实现INotifyPropertyChanged 接口来让 View 知道某些属性是否被更改。

但是 Model 应该如何通知 ViewModel 有关更改?它也应该实现INotifyPropertyChanged 吗?如果是这样,那么我们可以让 View 直接绑定到 Model 的属性。中间有一个额外的层的真正好处是什么,我们必须手动处理所有数据更改通知?

基于我的理解的示例:
查看:

<Grid>
    <TextBlock Text="{Binding foo}"/>
    <Label Content="{Binding bar}"/>
</Grid>

查看模型:

class ViewModel : INotifyPropertyChanged
{
    Model _m;
    public ViewModel(Model m)
    {
        _m = m;
    }

    public string foo
    {
        get
        {
            return _m.foo;
        }
        set
        {
            _m.UpdateFoo(value);
            //This one works fine. xaml will call getter to get the dead beef version
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("foo"));             
        }
    }

    public string bar
    {
        get
        {
            return _m.bar;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

型号:

class Model
{
    public string foo { get; private set; }
    public string bar { get; private set; }
    public void UpdateFoo(string newVal)
    {
        foo = newVal + "dead beef";
        bar = newVal; //how do i tell ViewModel that i have changed?
    }
}

【问题讨论】:

  • 太好了,投反对票的人能解释一下为什么投反对票吗?

标签: c# wpf mvvm


【解决方案1】:

通知可以来自模型通过INotifyPropertyChanged;但实际上,手动使用该界面可怕。必须根据已更改属性的名称来建立逻辑并不好玩。

带有通知的模型层可能类似于消息总线客户端,因为消息进入它会解析它并将相关(和强类型)事件发送到视图模型。然后,视图模型会更新其引发 PropertyChanged 的​​数据对象的属性。

对于您更大的问题:您是否必须拥有单独的 ViewModel 和 Model 数据对象?

如果你想成为一个纯粹主义者,当然可以;复制你的对象。如果您想要一种合理的方法,则只有在需要添加不适合(或不能存在于)模型对象的属性时才具有特殊的视图模型对象。

该模型更多的是关注点分离,而不是一组无用的重复对象。在前面的示例中,ViewModel 应该关心对象或事件是否来自消息总线,它只知道如何为视图设置对象。模型处理作为消息总线客户端的实现细节。

【讨论】:

  • 这意味着Model和ViewModel在大多数情况下可以合二为一。很高兴我多年来一直在做的事情不被认为是反模式。
猜你喜欢
  • 2014-06-16
  • 2011-09-05
  • 2010-10-21
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 2012-03-29
  • 2019-02-13
相关资源
最近更新 更多