问题描述
|
在WPF MvvmFoundation之后,将View与ViewModel链接起来有许多选择,如http://www.paulstovell.com/mvvm-instantiation-approaches所述。
但是,他们的示例没有关于如何将ViewModel与Model链接的内容。
传统上,我先创建模型,然后创建一个或多个渲染模型的视图。似乎MVVM促使人们创建视图,该视图创建了ViewModel,后者又创建了Model。我希望情况并非如此,因为将复杂的业务模型与各种ModelView连接起来可能会很困难。
您如何在MVVM中实例化业务模型类并将其与ViewModels链接?
解决方法
我通常将Model对象作为构造函数参数传递给VM。我使用App类作为控制器,它将使用主模型初始化MainWindow,MainWindowViewModel。之后,MainWindowViewModel负责使用适当的模型对象初始化其他VM。
private void Application_Startup(object sender,StartupEventArgs e)
{
mainWindow = new MainWindow();
mainWindow.DataContext = new MainWindowViewModel(new Model());
mainWindow.Show();
}
,您可以在ViewModel中创建BusinessModel类。
因此,在您的CustomerViewModel
中,您会说ѭ2ѭ,而您的CustomerView
将绑定到ViewModel的CurrentCustomer
属性。
如果您有兴趣,我将使用MVVM编写一个简单的示例,作为View,Model和ViewModel如何交互的示例。
,我使用依赖注入/ MEF来做到这一点。只需将所有模型类一直导出到整个链,然后自动将它们导入到ViewModel构造函数中即可。
,我会根据情况采取各种不同的方法。我发现,要链接此数据时,一个大小并不适合所有大小。
对于简单的情况,我将让ViewModel和Model相同。显然,这并不适合所有情况,但有时无需付出额外的努力即可将M与VM分开。 (非常适合您拥有列表框项目而信息很少的情况)
有时,尤其是当模型是您无权访问(由另一位开发人员编写)的代码块时,可以轻松地对模型进行子类化,并在其上添加所有VM内容(可观察的属性等)。 。
最后,我将使用Souvik提到的方法。使用要用作参数的模型信息构建VM,否则将其传递给虚拟机。对于我的更大和更复杂的Model / ViewModel关系,这可能是最常用的方法。
,我正在使用IoC容器将IRepository实例自动传递给VM构造函数,并且VM需要与模型进行的所有操作都通过此存储库完成。存储库是一类:创建,读取,更新和删除数据。当我需要显示一些视图(窗口)时,我使用IViewService.ShowDialog(viewModel作为ViewModelBase)。在IViewService的实现中,有向VM注册的视图,因此VM仅需要知道其他VM,而不必知道它们的视图(例如\“为此视图模型显示视图\”)。