MVVM - ViewModel/Model绑定

3

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

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

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

我想知道在这种情况下最佳的设计实践是什么......在ViewModel中像上面那样创建一个属性并将其绑定到xaml,还是为每个模型(如GroupViewModel和ContactViewModel)创建一个ViewModel,并且不使用ObservableCollections而使用List。

从设计角度来看,什么是最好的方法?我应该将Model还是ViewModel绑定到xaml?


你应该绑定到视图模型。 - Big Daddy
1个回答

4
很抱歉,您混淆了一些事情。MVVM的基础是:
  • Model - 包含应用程序正在处理的数据。应该尽可能保持简单。
  • ViewModel - 反映应用程序的状态并包含业务逻辑。它是业务层。
  • View - 解释ViewModel以提供业务层及其状态的可视化表示。
这三个部分很容易实现关注点分离和解耦架构。如果您想阅读更多信息,请点击此处
回到您的问题:
在这种情况下,有两个称为Group和Contact的模型(数据类)。组包含联系人列表。它们都实现了INotifyPropertyChanged接口。
这有点奇怪。通常情况下,您不需要在模型类中实现INotifyPropertyChanged,因为VM应该处理来自视图的值更改。
但是,在模型层中也可以使用该机制。但是,由于您不想跟踪此层上的更改,并且在我看来,VM应该负责此项工作,因此您不需要它。
是的,这通常是方法。对于每个应传递到视图层的模型类,您将创建一个ViewModel。
绝对不行。如果您使用List,则视图将不会了解集合的更改(添加,删除)。
简单地坚持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 { /* ... */ }
}

谢谢反馈。我的意思是,我将使用ObservableCollection<GroupViewModel>代替ObservableCollection<GroupModel>。这是我的错误 :) - Bogdan MITREA
你认为在XAML中绑定ViewModel而不是Model更好。 - Bogdan MITREA
这取决于观点或模式。在某些情况下(例如小型应用程序),创建虚拟机可能不值得努力。但是,如果坚持使用MVVM ... 是的...这是唯一的方法。这是基本机制之一。 - DHN
那么,一个ViewModel应该知道另一个ViewModel的情况吗(例如GroupViewModel将了解ContactViewModel)?我想这不是很好。或者呢? - Bogdan MITREA
当然可以。为什么不行呢?我会在我的帖子中添加一个小例子。 - DHN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接