MVVM:如果一个虚拟机对象直接暴露一个M对象,或只能通过干将委托给M的干将?(MVVM: Shou

2019-06-25 15:50发布

解释最好的办法是用例如这样:

这是模型

public class Person 
{
    public int age;
    public string name;
}

这是视图模型

public class PersonVM
{    
}

我的问题是:
应在VM揭露人的数据模板或封装用他自己的属性模型属性?

Answer 1:

视图模型应该定义它自己的属性和隐藏从视图模型的细节。 这给了你最大的灵活性,并有助于保持视图模型型问题漏入模型类。 通常您的视图模型类封装了委托模型。 例如,

class PersonModel {
    public string Name { get; set; }
}

class PersonViewModel {
    private PersonModel Person { get; set;}
    public string Name { get { return this.Person.Name; } }
    public bool IsSelected { get; set; } // example of state exposed by view model

    public PersonViewModel(PersonModel person) {
        this.Person = person;
    }
}

记住:模型不应该知道的是消费它的视图模型什么,视图模型不应该知道的是消费它认为任何东西。 视图应一无所知潜伏在后台的模特。 因此,在封装视图模型属性后面的模型。



Answer 2:

没有关于这个问题的总协定。 例如,它是大约MVVM由Ward贝尔制定了开放的一个问题在这里 :

是VM允许提供在V展开的M-对象(例如,原员工)? 或者必须在M-对象的属性(如果它甚至允许有特性!)独占通过VM包装材料的表面暴露?

的不直接暴露在VM的模型的主要优点是:

  • 你可以使用它作为一个“类固醇转换器”,在格式化的模型值的便捷的方式为视图

  • 你可以注入与用户界面等的funcionality,如数据验证消息 , 撤消重做 ,..

该缺点是:

  • 你将不得不重复大量的代码以暴露视图模型的所有车型性能。

  • 如果您绑定控件到的ViewModels属性,您将发送从视图模型中的PropertyChanged事件。 但是,如果发生了什么,从其他来源的车型属性更改从视图模型制定者有什么不同? 然后它有那么你有2 OnPropertyChanged,一个模型,一个在视图模型...相当复杂结束通知视图模型!

所以对我来说,正确的答案是:这取决于你的需求。



Answer 3:

这种情况的一个有趣的解决方案在MSDN第25卷,提出了由罗伯特·麦卡特。

http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

他使用的动态视图模型在模型的顶部提供一个层,同时避免代理所有的模型属性的。

如果您的问题空间并不需要高性能(动态做招致性能损失),这是一个很好的解决方案。 该视图并不需要知道模型什么,但视图模型不必正在提供的代理属性“按原样”。 在任何时间属性可以被添加到视图模型,而无需修改视图或模型来包装模型属性。 阅读文章的更多细节。



Answer 4:

有任何型号一个ViewModel能比这更糟糕。 如果你有什么模型的层次结构,甚至一个简单的集合? 在这种情况下,你必须通过所有车型迭代,并建立每个模型视图模型的实例,并且还注册通知变更事件或其他事件。 恕我直言,这完全是疯狂的,不合理的。 作为DaniCE说,你会用大量的代码而大伤脑筋结束。



文章来源: MVVM: Should a VM object expose an M object directly, or only through getters delegating to M's getters?