我应该为每个模型都有一个封装的 ViewModel 吗?

Should I have an encapsulating ViewModel for each Model?

我最近一直在使用 WPF 和 MVVM。我的印象是我非常了解 MVVM 模式,但我开始有些怀疑。

现在,我对每个模型对象都有一个封装的 ViewModel 对象。 假设我的模型包含两个 classes:Property,其中包含 PropertyValue 的列表。在我的 ViewModel 中,我有一个 PropertyVm,其中包含一个 Property 和一个 PropertyValueVm 列表(每个都包含一个 PropertyValue)。两个 Vm 都实现了一个 BaseVm,其中包含 OnPropertyChanged 方法。

考虑一个带有两个组合框的视图,PropertyPropertyValue。第一个组合框的 ItemsSource 将绑定到 PropertyVms 的集合,第二个组合框的 ItemsSource 将绑定到组合框 1 中选择的 PropertyVmPropertyValueVms .

这完全基于让我首先探索 WPF 和 MVVM 的文章:Simplifying the WPF TreeView by Using the ViewModel Pattern, by Josh Smith

但是,我对我的项目包含的大量 ViewModel classes 感到越来越恼火,其中一些包含很少的代码,或者除了相应的模型 class 之外什么都没有。

我遇到的其他实现在模型对象上有 INotifyPropertyChanged。这意味着您要将模型对象直接分配给组合框。这会减少 ViewModel 的数量 classes,但这是否违反了 MVVM 的基础?

我还看到有人提倡每个视图一个 ViewModel。但我担心这会将我的 ViewModel classes 变成巨大的、不连贯的文本墙。

所以我的问题简而言之:我应该为每个模型都有一个封装的 ViewModel 吗?如果不是,那么最佳做法是什么?

MVVM 的主要驱动力是通过表示和表示逻辑的强分离来最大化可测试代码。理想情况下,我们将表示逻辑封装在一个或多个视图模型中——因此就您的子问题而言,拥有尽可能多的视图模型是有意义的。根据我的经验,将功能划分为一系列较小的视图模型是一种很好的做法。但是没有一种放之四海而皆准的方法来实现这一点。所以在某些方面,问题的答案是:这取决于你的情况。

如果您的模型永远不会改变,那么您已经走到了宗教的岔路口。实用主义者将模型暴露给 UI 绑定(有罪!!)。纯粹主义者将模型包装在视图模型中,因为 VM 在设计中位于 M 和 V 之间,如果我们不教条地遵守这一点,那么肯定会发生坏事。

如果您的模型发生变化,那么您可以进行设计选择。您可以保持模型不可变并使用新版本的模型刷新您的视图模型并从那里提出更改。或者,如果您的架构促进了 UI 只需要表示的不断更新的模型,那么问问自己,您是否真的通过在中间放置一个视图模型而获益。但!!一旦您嗅到逻辑渗透到模型中,那么它就值得一个视图模型。