首页 文章

MVVM - ViewModel / Model绑定

提问于
浏览
3

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

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

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

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

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

1 回答

  • 4

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

    • Model - 包含应用程序正在使用的数据 . 它应该尽可能简单 .

    • ViewModel - 反映应用程序的状态并包含业务逻辑 . 这是业务层 .

    • View - 解释ViewModel以提供业务层及其状态的直观表示 .

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

    回到你的问题:

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

    那个's a bit odd. Usually, you don't需要在模型类中实现 INotifyPropertyChanged ,因为VM应该从视图中处理值的变化 .

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

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

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

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

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

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

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

    Edit

    以下是完全合法的 .

    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 { /* ... */ }
    }
    

相关问题