ViewModel和Model之间的MVVM设计模式关系

时间:2017-12-20 21:26:01

标签: c# wpf mvvm

基于MSDN的图片

enter image description here

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

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

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

基于我的理解的例子:
视图:

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

1 个答案:

答案 0 :(得分:1)

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

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

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

NO

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

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