Silverlight 将通用ViewModel功能推送到基类中?

Silverlight 将通用ViewModel功能推送到基类中?,silverlight,mvvm,viewmodel,Silverlight,Mvvm,Viewmodel,我正在使用MVVM和Prism和Silverlight。我有一个模型的多个不同视图。在我编写更多视图时,他们的视图模型似乎复制了许多与处理这一模型相关的常见代码。我不想在所有虚拟机中重复相同的通用代码,而是想将其推回到模型中(这可能会混合太多的关注点)。或者可能进入一些常见的ViewModel基类?或者我的虚拟机和模型之间需要第二级的“共享虚拟机”?这个单一的共享实例,第二级VM将整合多个常规VM共享的行为和状态 对这些问题和可能的方法有何评论 谢谢大家的评论。我可能应该告诉您更多关于特定的“

我正在使用MVVM和Prism和Silverlight。我有一个模型的多个不同视图。在我编写更多视图时,他们的视图模型似乎复制了许多与处理这一模型相关的常见代码。我不想在所有虚拟机中重复相同的通用代码,而是想将其推回到模型中(这可能会混合太多的关注点)。或者可能进入一些常见的ViewModel基类?或者我的虚拟机和模型之间需要第二级的“共享虚拟机”?这个单一的共享实例,第二级VM将整合多个常规VM共享的行为和状态

对这些问题和可能的方法有何评论


谢谢大家的评论。我可能应该告诉您更多关于特定的“共享”VM代码的问题

我可以看到将一些未来的代码放入VM基类中,但我正在查看的特定“共享”代码似乎属于由模型本身实现的INotifyPropertyChanged中。这部分是基于此

我不认为这违反了SoC,因为模型本身就是动态的。它的某些属性仅在特定时间有效。模型的动态特性不仅对UI很重要,适当的单元测试也会关注它。因此,此模型似乎需要更改InotifyProperty


对此有何评论?

如果通用代码可以由所有ViewModels共享,那么值得将其放入基本ViewModel类型中


如果公共代码仅由与特定模型交互的ViewModels共享,则“共享”ViewModel是一种选择。

如果公共代码可由所有ViewModels共享,则值得将其放入基本ViewModel类型中


如果公共代码仅由与特定模型交互的ViewModels共享,那么“共享”ViewModel就是一种选择。

我在中成功地使用了ViewModels的继承来减少复制的代码。以CommunityRecentCommentCommentComments及其父类CommunityBase为例。

我在中成功地使用了ViewModels继承来减少复制代码。以CommunityRecentCommentCommentComments及其父类CommunityBase为例。

各种MVVM框架中的大多数“基本视图模型”类倾向于包含对INotifyPropertyChanged的支持,通常还包含对分派回UI线程的某种支持

除此之外,我认为如果您有许多共享功能的ViewModel,这些功能应该属于基类,那么我越是使用这种模式,我就越发现自己使用的ViewModels层次结构就越浅,一个基本视图模型,用于所有视图模型通用的代码,通常是在该模型下的另一个基类,用于该UI区域中的通用功能。通常是通用命令或UI共享元素的位置

ViewModelBase->ProductsViewModelBase->NewProductViewModel

各种MVVM框架中的大多数“基本ViewModel”类都倾向于包含对INotifyPropertyChanged的支持,通常还包含对分派回UI线程的某种支持

除此之外,我认为如果您有许多共享功能的ViewModel,这些功能应该属于基类,那么我越是使用这种模式,我就越发现自己使用的ViewModels层次结构就越浅,一个基本视图模型,用于所有视图模型通用的代码,通常是在该模型下的另一个基类,用于该UI区域中的通用功能。通常是通用命令或UI共享元素的位置

ViewModelBase->ProductsViewModelBase->NewProductViewModel

在中,它是完全的MVVM,我定义了一个IViewModel接口和一个AbstractViewModel基类,正如Nigel所说,它只是实现了INotifyPropertyChanged。(请注意,SoapBox核心是WPF,而不是Silverlight,但在本例中这并不是什么大问题。我也做过一些类似的Silverlight工作。)

然后,我定义了更多从IViewModel继承的接口(如IMenuItem),以及更多提供这些接口基本实现的抽象类

现在,这说明了整个ViewModel树,但正如您所说,还有模型树。我现在已经花了将近一年的时间与MVVM合作,这是我最大的顿悟:不要编写模型。如果您是从头开始构建应用程序,只需将所有内容都放在ViewModel中,否则最终会复制大量代码

我只在使用没有实现INotifyPropertyChanged的第三方库的情况下才费心创建一个模型,因此不容易绑定到它。我相信实体框架的自动生成代码可能也在这里,但我注意到一些实体框架现在给了您在实体本身中实现INotifyPropertyChanged的选项

说真的,我们应该将其重命名为ViewModel模式,并对其进行处理。:)

在完全是MVVM的中,我定义了一个IViewModel接口和一个AbstractViewModel基类,正如Nigel所说,它只实现INotifyPropertyChanged。(请注意,SoapBox核心是WPF,而不是Silverlight,但在本例中这并不是什么大问题。我也做过一些类似的Silverlight工作。)

然后,我定义了更多从IViewModel继承的接口(如IMenuItem),以及更多提供这些接口基本实现的抽象类

现在,这说明了整个ViewModel树,但正如您所说,还有模型树。我现在已经花了将近一年的时间与MVVM合作,这是我最大的顿悟:不要编写模型。如果您是从头开始构建应用程序,只需将所有内容都放在ViewModel中,否则最终会复制大量代码

我只在使用没有实现INotifyPropertyChanged的第三方库的情况下才费心创建一个模型,因此不容易绑定到它。我相信汽车是通用的