【问题标题】:MVVM - ViewModel/Model bindingMVVM - ViewModel/Model 绑定
【发布时间】:2013-06-14 12:04:37
【问题描述】:

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

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

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

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

最好的方法是什么(设计方面)?我应该将模型或视图模型绑定到 xaml 吗?

【问题讨论】:

  • 你应该绑定到视图模型。

标签: mvvm model viewmodel


【解决方案1】:

恐怕你把一些事情搞混了。 MVVM的基础是

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

通过这三个部分,很容易提供关注点分离和解耦架构。如果你想了解更多,click here

回到你的问题:

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

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

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

[...] 在绑定到 xaml 或为每个模型(如 GroupViewModel 和 ContactViewModel)创建一个 ViewModel 的 ViewModel 中有一个类似上述的属性 [...]

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

[...] 而不是 ObservableCollections 有一个列表。

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

最好的方法是什么(设计方面)?我应该将模型或视图模型绑定到 xaml 吗?

只需坚持使用 MVVM。视图知道 VM,但 VM 不知道视图。此外,VM 知道模型,但模型不知道它。这意味着,您应该始终将 VM 绑定到视图。

编辑

以下内容完全合法。

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 代替 ObservableCollection。我的错:)
  • 你认为绑定ViewModel而不是xaml中的Model更好。
  • 这取决于观点或模式。可能存在一些场景(例如小型应用程序),在这些场景中创建 VM 是不值得的。但是如果你坚持使用 MVVM……是的……这是唯一的方法。这是基本机制之一。
  • 然后,一个 ViewModel 应该知道另一个 ViewModel 是否可以(例如 GroupViewModel 将知道 ContactViewModel)?我想这不太好吧。还是?
  • 当然没问题。为什么不应该呢?我将在我的帖子中添加一个小示例。
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
相关资源
最近更新 更多