MVVM的ViewModel继承想知道在MVVM模式下如何使用ViewModels进行继承。在我的应用程序中,我有一个如下所示的数据模型:classCustomObject{publicstringTitle{get;放;}}classCustomItem:CustomObject{publicstringDescription{get;放;}}classCustomProduct:CustomItem{publicdoublePrice{get;放;在我的应用程序中,我有一个ViewModelBase类,它将具有以下视图模型:CustomObjectViewModel的粗略实现如下所示:publicCustomObjectViewModel(CustomObjectcustomObject){_customObject=customObject;}publicstringTitle{//为简洁起见排除了实现}}对我来说,我的视图模型将以与模型相同的方式扩展自身(CustomItemViewModel扩展CustomObjectViewModel等),这似乎合乎逻辑。但是,我注意到当我继承树时,我添加了对同一对象的附加引用。这对我来说似乎有点矫枉过正,想知道如何处理这个问题以及是否有可能让它变得更干净。一般来说,我建议你不要在不同的ViewModel类之间继承,而是让它们直接从一个公共的抽象基类继承。这是为了避免通过层次结构中更高级别的成员污染ViewModel类的接口而引入不必要的复杂性,但这并不完全符合该类的主要目的。继承带来的耦合也使得在不影响任何派生类的情况下更改ViewModel类变得困难。如果ViewModel类总是引用单个Model对象,则可以使用泛型将此规则封装到基类中:publicabstractclassViewModelBase{privatereadonlyTModel_dataObject;publicCustomObjectViewModel(TModeldataObject){_dataObject=dataObject;}受保护的TModel数据对象{得到;}}publicclassCustomObjectViewModel:ViewModelBase{publicstringTitle{//为简洁起见排除了实现}}publicclassCustomItemViewModel:ViewModelBase{publicstringTitle{//为简洁起见排除了实现}publicstringDescription{//为简洁起见排除了实现}和Enrico's上面的评论是相关的。ViewModels不应该与View紧密耦合,它应该是相反的。视图应该与ViewModel松耦合。ViewModel不应该知道View,这使您可以轻松地对ViewModel进行单元测试。View和ViewModel之间的所有交互都应通过ViewModel中的属性(用于操作的ICommand属性和用于数据绑定的其他属性)来实现。有一件事是真实的,ViewModel与Model紧密耦合,因此使用上面的泛型可以实现很大的可扩展性。这是我推荐的模式。通过提供基本上只公开属性的ViewModel类,它应该允许您将其扩展到任何类型的表示框架并利用您之前使用的所有代码。换句话说,如果实现正确,您可以将ViewModel程序集放入ASP.NETMVC应用程序并将视图绑定到属性,而无需更改代码。一篇关于MVVM基础知识的好文章是:这篇。我真的认为MVVM是UI开发的最佳选择。显然我们不能全部使用它,因为它需要使用MVVM方法从头开始构建应用程序,但是当您构建新应用程序时,这不是问题。我对ICommand的一个抱怨是它基本上在PresentationCore程序集的WPF中使用。如果微软想要松散耦合,它应该完全在另一个程序集中。我认为这里的问题是每个视图应该有一个ViewModel,而不是每个模型有一个ViewModel。原因很明显,因为您只能将一个对象设置为DataContext,它应该是该View的ViewModel。我很想知道是否有更好的答案,但是当我遇到同样的问题时,我总是将对象的显式转换为私有属性,如下所示:publicCustomObjectViewModel(CustomObjectcustomObject){CustomObject=customObject;}publicstringTitle{//为简洁起见排除了实现}}classCustomItemViewModel:CustomObjectViewModel{protectedCustomItemCustomItem{get{return(CustomItem)CustomObject;}}publicCustomItemViewModel(CustomItemcustomItem):base(customItem){}}它工作正常,这是我想出的最好的,但我从来没有感觉干净。以上就是C#学习教程:视图模型的MVVM继承分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
