启动逻辑应该放在MVVM中的哪个位置?

时间:2012-06-21 05:35:00

标签: .net wpf mvvm

我正在使用MVVM编写我的第一个WPF应用程序,我对视图模型的作用感到困惑,我应该把应用程序启动时运行的代码放在哪里。

我的申请很简单。它列出了远程位置的文件,然后用户可以从中选择将其复制到自己的计算机上。当应用程序首次启动时,它必须从配置文件中确定当前文件源,读取源中的当前文件,并在主窗口中将它们列出给用户。如果找不到配置的文件源,系统将提示用户选择源。

这个逻辑应该放在ViewModel中吗?如果是这样,它应该放在视图模型的构造函数中?这似乎不对,因为我不希望ViewModel读取配置文件,并在用户实例化时随时提示用户。

如果这是一个WinForms应用程序,我会在Form.Load或Form.Shown事件中执行此操作。

3 个答案:

答案 0 :(得分:3)

通常主数据加载代码可以保存在单独的viewmodel函数中,例如ViewModel.Initialize() ...更重要的是在后台线程中,它不会在执行时挂起GUI,直到那一刻你可以显示GUI上忙碌的服务员动画。

您可以轻松Command驱动它(例如Relay / DelegateCommand,例如InitilizeCommand)和Initialize()方法可以是命令的Execute委托。

可以根据您的方便调用

Initialize() ...从ViewModel的构造函数开始,或使用附加行为处理Window / UserControl.Load事件并安排“ViewModel.Initialize ()'函数,只要函数在不同的后台线程上,我们就好了。

如果您使用PRISM的模式和实践,那么像这样的数据加载可以自动安装到特定模块中,作为Prism所代表的复合GUI整体设计的一部分。

这里有一个好的MVVM教程...... http://msdn.microsoft.com/en-us/library/gg405484%28v=pandp.40%29.aspx

答案 1 :(得分:3)

如果你有一个简单的应用程序,并且已知启动不冗长, 你可以利用统一来引导你的应用程序。

所做的一切都在一个非常好的视频介绍中显示 MVVM在这里可用: Jason Dollinger on MVVM

他在此视频中开发的源代码也可用: Source code of the model-view-viewmodel video

除此之外,你的引导逻辑(读取配置,...)应该 显然是由viewmodel控制的。你仍然可以拥有一个ConfigSource, 它可以读取,也可以在后台线程中运行。

实现该源,您可以拥有一个接口来实现它 很容易将ConfigSource与读取数据的人交换 来自数据库或其他地方。 AND:你可以从中获得这样的实例 团结,从具体实施中解脱出来。你可以用 构造函数注入如下:

即。 viewmodel是bootstrapped =>获取一个ConfigReader注入 =>调用ConfigReader(在BackgroundThread上)=>查看填写

答案 2 :(得分:1)

不要在ctor中执行复杂逻辑是一种很好的做法。如前所述,最好定义Initialize()方法(如果它是IInitializable接口的成员,则更好。)

如果您的应用非常简单并且没有计划对其进行大量扩展,则可以将ModelViewModel图层合并,并在ViewModel中完成所有工作。但是,如果您的应用程序足够复杂,则应通过构造函数将Model类注入ViewModelModel类包含所有逻辑,ViewModel使用它们来执行操作和显示数据。