【问题标题】:Where should startup logic go in MVVM?MVVM 中的启动逻辑应该放在哪里?
【发布时间】:2012-06-21 05:35:00
【问题描述】:

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

我的应用程序非常简单。它列出了来自远程位置的文件,然后用户可以从中选择以复制到他们自己的计算机上。当应用程序第一次启动时,它必须从配置文件中确定当前文件的来源,从源头读取当前文件,并在主窗口中将它们列出给用户。如果找不到配置的文件源,则会提示用户选择一个源。

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

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

【问题讨论】:

    标签: .net wpf mvvm


    【解决方案1】:

    通常,主要数据加载代码可以保存在单独的视图模型函数中,例如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

    【讨论】:

      【解决方案2】:

      如果您有一个简单的应用程序并且已知启动时间不长, 您可以使用统一引导您的应用程序。

      在一个非常好的视频介绍中展示了这一切 到这里可用的 MVVM: Jason Dollinger on MVVM

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

      除此之外,您的引导逻辑(读取配置,...)应该 显然是由视图模型控制的。你仍然可以有一个 ConfigSource, 哪个可以读取并且可以在后台线程中运行。

      实现那个Source,你可以有一个接口,这使得它 易于将您的 ConfigSource 与读取数据的配置源交换 从数据库或其他地方。并且:您可以从 统一,更多地与具体实现脱钩。你可以使用 构造函数注入:

      即viewmodel 被引导 => 获得一个 ConfigReader 注入 => 调用 ConfigReader(在 BackgroundThread 上)=> 视图被填满

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2023-04-07
          • 1970-01-01
          • 2016-12-18
          • 2014-10-26
          • 2012-07-16
          • 2010-10-11
          • 2017-10-06
          • 2015-12-01
          • 1970-01-01
          相关资源
          最近更新 更多