MVVM - ViewModel / Model绑定

时间:2013-06-18 10:05:57

标签: mvvm model viewmodel

我对使用父子模型关系的MVVM的最佳实践有一些疑问。

在该特定情况下,有两个模型(数据类),称为Group和Contact。该组包含联系人列表。它们都正在实现INotifyPropertyChanged接口。

在视图中,有一个使用DataTemplate显示层次结构的树视图,相关的ViewModel包含一个ObservableCollections属性。

我想知道在这种情况下什么是最佳实践设计....在ViewModel中有一个像上面一样的属性,它绑定到xaml或为每个模型创建一个ViewModel(比如GroupViewModel和ContactViewModel)而不是ObservableCollections有一个清单。

最好的方法是什么(设计明智)? Shoudl我将Model或ViewModel绑定到xaml?

1 个答案:

答案 0 :(得分:4)

我害怕,你混淆了一些东西。 MVVM的基础是

  • 模型 - 包含应用程序正在使用的数据。它应该尽可能简单。
  • ViewModel - 反映应用程序的状态并包含业务逻辑。这是业务层。
  • View - 解释ViewModel以提供业务层及其状态的直观表示。

通过这三个部分,可以很容易地分离关注点和分离的体系结构。如果您想了解更多内容,请click here

回到你的问题:

  

在该特定情况下,有两个模型(数据类),称为Group和Contact。该组包含联系人列表。它们都正在实现INotifyPropertyChanged接口。

这有点奇怪。通常,您不需要在模型类中实现INotifyPropertyChanged,因为VM应该从视图中处理值更改。

但是也可以想象在模型层中也有这种机制。但是,由于您不想跟踪此层上的更改以及VM应该关注的恕我直言,您不需要它。

  

[...]在ViewModel中有一个像上面一样的属性,它绑定到xaml或为每个模型创建一个ViewModel(如GroupViewModel和ContactViewModel)[...]

是的,这通常是方法。对于应传递给视图层的每个模型类,您将创建一个ViewModel

  

[...]而不是具有List的ObservableCollections。

这绝对是一个。如果您使用List<T>,视图将不会知道对集合的更改(添加,删除)。

  

最好的方法是什么(设计明智)? Shoudl我将Model或ViewModel绑定到xaml?

简单地坚持MVVM。该视图知道VM,但VM不知道该视图。此外,VM知道该模型,但模型并未意识到该模型。这意味着,您应始终将VM绑定到View。

修改

以下是完全合法的。

public class Address : ViewModelBase // implements INotifiedPropertyChanged a.s.o.
{
    public string Street { /* you know what comes here */ }
    public string ZipCode { /* ... */ }
    public string City { /* ... */ }

    /* more properties */
}

public class Person : ViewModelBase 
{
    public string Name { /* ... */ }

    public Address Address { /* ... */ }
}