我在哪里实例化我的视图模型对象?

时间:2010-11-11 20:08:41

标签: wpf design-patterns mvvm

我正在编写一个小应用程序来学习WPF / MVVM,我遇到了一个难题,我有一个viewmodel对象准备好了,但我不知道在哪里实例化。

viewmodel表示单个窗口数据(一些滑块值,一个进度条值和一些文本字符串。其中一些直接附加到公开的模型,其他一些在viewmodel中以避免向模型添加新功能。 )

我一次只需要这些对象中的一个(每个窗口,但我只允许1个窗口),尽管它实际上不是单个。它会在窗口的生命周期中存在(这是正常的吗?)

所以我的问题是:我应该将viewmodel实例化为App.Xaml中的静态资源,作为后面代码中的App.xaml.cs类的成员(在重写的“OnStartup”方法内部)或者作为Window.xaml中的资源,或作为Window.xaml.cs中的对象。

我见过人们把它作为本地资源和初创公司的全局对象,但对我而言,它似乎不应该在后面的代码中(我所做的就是把它扔到空中,一旦它存在,它就可以处理其他所有事情。实际上,这就是它的全部要点。

那么想一下viewmodel应该在哪里实例化?

2 个答案:

答案 0 :(得分:4)

窗口视图模型仅在其窗口的生命周期内存在是完全正常的。创建它可以像放入:

一样简单
DataContext = new MainWindowViewModel();

MainWindow的构造函数中。这就是我在没有令人信服的理由的情况下这样做的原因。 (如果窗口需要在其事件处理程序中与视图模型进行互操作,它有时会执行此操作,我将为该对象创建一个私有字段,这样我就不必继续对其进行转换DataContext事件处理程序。)

通常,视图模型需要与一个或多个域对象进行互操作。在这种情况下的挑战是提出一种方法来告诉关于该对象的视图模型,而不将域对象耦合到创建视图模型的窗口。这是您开始使用服务和服务定位器以及可模拟对象等的地方。

但即使你这样做,你仍然可以在窗口的构造函数中创建视图模型,例如:

ServiceLocator loc = (ServiceLocator) FindResource("AppServiceLocator");
DataContext = new MainWindowViewModel(loc);

唯一一次在窗口的构造函数中创建一个窗口的视图模型时,其他一些对象(如另一个窗口中的命令)正在创建窗口并设置其{{1 }}

答案 1 :(得分:0)

我通常会使用ViewModelLocator的概念。 ViewModelLocator是App.xaml中的StaticResource。

ViewModelLocator使用IoC进行依赖注入(Ninject / Unity / ...),可以在DI中为ViewModel的Livetime定义范围...

还有一些与MEF和ViewModelLocator概念一起使用的博客...