2013-06-18 126 views
2

我对使用父子模型关系的MVVM的最佳实践有些疑问。MVVM - ViewModel/Model binding

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

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

我在想这是什么样的最佳实践设计......在ViewModel中绑定到xaml或为每个模型(如GroupViewModel和ContactViewModel)创建一个ViewModel的上面有一个属性,而不是ObservableCollections有一个List。

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

+0

您应该绑定到视图模型。 –

回答

3

恐怕你混了一些东西。 MVVM的基础知识是

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

有了这三个部分,提供问题分离和分离架构非常容易。如果你想阅读更多,click here

回到你的问题:

在这种特定情况有两种模式(数据类)称为集团和联系。该组包含联系人列表。他们都在实现INotifyPropertyChanged接口。

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

但在模型层中也可以想象得到这种机制。但既然你不想追踪这层和IMHO的变化,虚拟机应该关心,你不需要它。

[...]具有在ViewModel一个属性像上面被结合到XAML或createing一个ViewModel每个模型(如GroupViewModel和ContactViewModel)[...]

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

[...]而不是具有列表的ObservableCollections。

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

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

只需粘贴到MVVM。该视图知道该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 { /* ... */ } 
} 
+0

感谢您的反馈 我的意思是,而不是有一个ObservableCollection 我将有一个ObservableCollection 。我的错:) –

+0

你认为在xaml中更好的绑定ViewModel而不是Model。 –

+0

那么这取决于观点或模式。可能有一些场景(例如小应用程序),在这些场景中创建虚拟机并不值得。但是如果你坚持使用MVVM ......是的......这是唯一的方法。这是基本机制之一。 – DHN