大智能ViewModels、愚蠢的视图和任何模型,最好的MVVM方法?下面的代码是对我以前的MVVM方法(胖模型、瘦ViewModel和哑视图,最好的MVVM方法?)的重构,我将逻辑和INotifyPropertyChanged实现从模型移回了ViewModel。这更有意义,因为正如所指出的,您经常不得不使用您无法更改或不想更改的模型,因此您的MVVM方法应该能够使用它碰巧存在的任何模型类。此示例仍然允许您在VisualStudio和ExpressionBlend的设计模式下查看模型中的实时数据,我认为这很重要,因为您可以拥有设计器连接到的模拟数据存储,例如最小和最大字符串。UI可能会遇到让他可以根据这些边缘情况调整设计。问题:如果您只是将XAML和代码复制到新的WPF项目中,则以下代码将起作用。XAML:代码背后:usingSystem;使用System.Windows;使用System.ComponentModel;使用系统线程;namespaceTestMvvm73892{publicpartialclassWindow1:Window{publicWindow1(){InitializeComponent();}}//视图模型publicclassCustomerViewModel:INotifyPropertyChanged{privatestring_firstName;私有字符串_lastName;私人日期时间_timeOfMostRecentActivity;私人计时器_timer;publicstringFirstName{get{return_firstName;}设置{_firstName=值;this.RaisePropertyChanged("FirstName");}}publicstringLastName{get{return_lastName;}设置{_lastName=值;this.RaisePropertyChanged("姓氏");}}publicDateTimeTimeOfMostRecentActivity{get{return_timeOfMostRecentActivity;}设置{_timeOfMostRecentActivity=值;this.RaisePropertyChanged("TimeOfMostRecentActivity");}}publicCustomerViewModel(){_timer=newTimer(CheckForChangesInModel,null,0,1000);}私有无效CheckForChangesInModel(objectstate){CustomercurrentCustomer=CustomerViewModel.GetCurrentCustomer();MapFieldsFromModeltoViewModel(currentCustomer,this);}publicstaticCustomerViewModelGetCustomerViewModel(){CustomerViewModelcustomerViewModel=newCustomerViewModel();客户currentCustomer=CustomerViewModel.GetCurrentCustomer();MapFieldsFromModeltoViewModel(currentCustomer,customerViewModel);返回customerViewModel;}publicstaticvoidMapFieldsFromModeltoViewModel(Customermodel,CustomerViewModelviewModel){viewModel.FirstName=model.FirstName;viewModel.LastName=model.LastName;viewModel.TimeOfMostRecentActivity=model.TimeOfMostRecentActivity;}publicstaticCustomerGetCurrentCustomer(){returnCustomer.GetCurrentCustomer();}//INotifyPropertyChanged实现publiceventPropertyChangedEventHandlerPropertyChanged;privatevoidRaisePropertyChanged(stringproperty){if(PropertyChanged!=null){PropertyCh生气(这,新的PropertyChangedEventArgs(属性));}}}//模型publicclassCustomer{publicstringFirstName{get;放;}publicstringLastName{get;放;}publicDateTimeTimeOfMostRecentActivity{get;放;}publicstaticCustomerGetCurrentCustomer(){returnnewCustomer{FirstName="Jim",LastName="Smith",TimeOfMostRecentActivity=DateTime.Now};我喜欢上面的例子,我认为它实现了MVVM的精神但是,需要澄清的是,ViewModel代码和Model代码不应该与实际的代码隐藏在同一个源文件中。事实上,我认为他们不应该在同一个项目中。据我了解,这是MVVM:M-模型是从业务层(BL)返回的数据。这应该是轻量级的并且包含只读数据。模型类是哑的,不包含更新、写入或删除逻辑,并且由BL作为请求、命令、操作等的结果生成。模型类不知道消费应用程序的表示需求,因此可以使用它们以任何方式。为了真正利用这种可重用性,我们希望模型类独立于UI项。VM-ViewModel包含通信层:它向BL发出请求并以适合呈现的方式处理结果。与上面的示例一样,它也采用模型并根据特定的演示需求对其进行重新格式化。将其视为“绑定类”。在上面的示例中,数据只是从一个对象移动到下一个对象,但是ViewModel会处理诸如公开“FullName”类型属性或向ZipCode添加前导零之类的事情。您是正确的,绑定类是实现INotifyPropertyChanged的??类。而且,为了可重用性,我可能也会将这一层提取到我自己的项目中。这将允许您在不更改管道的情况下试验各种UI选项。V-View绑定到在VM中创建的Binding类对象。View非常愚蠢:它对BL或VM一无所知。数据可以双向绑定,但是VM处理错误、验证等。任何数据同步操作都是通过将请求传回BL并再次处理结果来处理的。这将取决于应用程序的类型,但继续检查模型以查看它是否已更改似乎很重要。假设您要连接到一个BL,该BL从连接到DB的DAL构建业务对象(BO)。在这种情况下,您将不断地重新创建BO,我认为这将成为性能杀手。您可以在BL上实现一个收银台系统来侦听通知,或者有一个方法将最后已知的更改时间与实际时间进行比较,或者您可以在BL上缓存BL。只是一些想法。另外,我在上面说过模型应该是轻量级的。有很多重量级的选项,比如CSLA,但我不确定它们是否符合MVVM的想法。我并不是要让自己成为专家,到目前为止,我只是在设计新的软件架构时研究这些想法。我想阅读有关此主题的一些讨论。就个人而言,我认为虽然模型应该用于加载和存储数据,但ViewModel有责任知道何时需要该数据,因此在ViewModel中使用计时器是有意义的。这样您就可以将模型与不同的ViewModel一起使用(为此,只检索一次数据,而不是每秒检索一次)。需要考虑的几件事:以上是C#学习教程:BigSmartViewModels、DumbViews和任何模型、最佳MVVM方法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
