最好的方式来解释是如此:

这是模型

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

这是模型

public class PersonVM
{    
}

我的问题是:
应该vm让人的数据模板或封装的模型的属性与自己的属性?

有帮助吗?

解决方案

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

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

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

其他提示

没有一般性协议有关这个问题。例如,它是一个开放性问题有关。制订的病房钟 在这里,:

是VM允许提供的V一个 解开M-对象(例如,原 雇员)?或者必须M目的 性质(如果它甚至允许 具有的性质!) 被暴露 完全通过面的 VM包装?

主要的优点不能直接暴露模型在虚拟机是:

  • 你可以用它作一个"转换器类固醇",格式化的模式的价值在一个方便的方式为查看

  • 你可以注入其他功能也作相关的用户界面,就像 验证数据消息, 撤消重做,..

缺点是:

  • 你会需要重复许多代码,以获得的所有模型的属性模型.

  • 如果你绑的视图控制这个例子酒店,您将送引发事件的模型.但是会发生什么,如果该模型的属性变化,从其他来源不同的模型器?然后,它具有以通知的视图模型所以你最终有2OnPropertyChanged,一个在模型和一个在模型...相当复杂!

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

在MSDN体积提出由Robert麦卡特对此的一个有趣的解决方案25.

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top