MVVM中的ViewModel有很多属性

9

我刚接触MVVM,并正在开发一个应用程序。我有一个带有很多属性的表单视图,大约有50个。我不能将它们分成用户控件,因为这样会违反MVVM原则。

我也不能将它们分到模型中,因为它们包含逻辑。属性更改、错误更改等都不是POCO类,也不是模型。

如果我在同一个ViewModel中保留60个属性会怎么样?

我想错了吗? 你会如何组织这些属性?


4
为什么在不破坏MVVM的情况下无法创建一个“UserControl”? - Viv
2
Viv提出了一个好问题。您可以在主ViewModel中为用户控件创建ViewModel。此外,您可以使用某种“控制器”层来处理逻辑,并仅在ViewModel中保持PropertyChanged实现的清晰。最明智的方法是:创建基本ViewModel并从中派生。 - VidasV
我知道我不能使用UserController,因为http://stackoverflow.com/questions/17048066/mvvm-light-test-viewmodel-with-view-and-create-staticresource-locator。 - Lajos
2
我会说:如果您需要在视图中显示60个内容,则必须在您的视图模型中保留这60个属性。但是,如果您可以将视图拆分为用户控件,则也可以拆分您的视图模型。 - blindmeis
听起来不错,例如,我有一个表单视图和一个相应的表单视图模型,那么我能否编写一个地址视图模型作为其一部分? - Lajos
2个回答

2
我不能将这些分离成用户控件,因为这样会违反MVVM原则。如果您正在使用MVVM模式,那么视图就是WPF的UserControl(或Window),只是从概念上来说,在该模式中它们被视为视图。建议使用一个MVVM框架,例如Caliburn.Micro,这样可以轻松实现视图组合。同时,不建议使用依赖属性来处理视图模型,而应该使用INotifyPropertyChanged。大多数MVVM框架提供了基本的视图模型类型,其中包括基于lambda表达式的方法来调用PropertyChanged事件,从而帮助重构。

我是新手,但我读到可以只使用依赖属性来使用用户控件,因为所有的属性都应该在视图模型中,而用户控件将通过依赖属性来显示它。所以如果我使用了用户控件,依赖属性仍然留在视图模型中,只是会有更多的代码行数。 - Lajos
您的视图将是声明性XAML的UserControls,并将实例化控件,例如TextBlock,该控件具有依赖属性,例如其Text属性。绑定的目标需要是一个依赖属性,而不是源属性。因此,您的视图模型将实现INPC,绑定仍将起作用,因为TextBlock目标属性是一个依赖属性。 - devdigital
好的,但在这种情况下,主视图模型中的属性将不会分离。我可以创建一个没有视图的视图模型,并在主视图模型中使用它吗? - Lajos
为什么它们不能被分开? - devdigital

1

3
既然文章作者指出了一些点,建议在实现 INotifyPropertyChanged(例如测试)时,您不应该推荐使用 DependencyProperty 而不给出提示,说明它有一些限制。 - DHN
既然我发布了这篇文章的链接,那么提问者肯定会仔细阅读它 :) 但是你当然是对的,让他自己考虑而不是只推荐使用“DependencyProperty”会更好。 - Johannes Wanzek
对不起,我不同意。*请不要为60个属性使用PropertyChanged,而是使用DependencyProperty[...] *这意味着没有缺点。我了解自己,也了解其他开发人员...我们讨厌冗长的文本,所以他可能会忽略缺点。 - DHN
根据他的问题,推荐使用“DependencyProperties”没有任何问题。对于其他方面,可以阅读该文章。 - Johannes Wanzek
请参阅此文章以了解反驳意见:http://kent-boogaart.com/blog/view-models-pocos-versus-dependencyobjects/ 结论:“我认为 POCO 视图模型(即 INotifyPropertyChanged)相对于 DependencyObject 视图模型的优势是明显且令人信服的。” - Edward

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