WPF / MVVM - 如何在启动时执行命令?

时间:2011-02-04 13:31:37

标签: wpf mvvm startup

我正在按照MVVM原则编写WPF应用程序。

我不想在启动时执行命令 - 我对什么是最好的方法有疑问?

ViewModel应该对是否有任何视图无动于衷,对吧?

在VM构造函数中最后做的事情是“ok”吗?或者是否有“应用程序现已启动并运行,所有初始化已完成”的事件,我可以挂钩?

将它连接到视图模型中感觉不对?

稍微具体一点,如果用户在首选项中选择了那个,我想像Visual Studio一样加载“最新解决方案”。如果用户通过GUI手动加载解决方案我在MainFormViewModel中启动流程,我可以在那里的最后一行构造函数中处理负载吗?

有什么想法?

丹麦安德斯

5 个答案:

答案 0 :(得分:2)

Windows.Interactivity方法或从构造函数异步加载其首选项同样可行 - 如果您使用MefedMVVM框架,则存在替代方法。

您还可以导入IContainerStatus以附加到完全从视图模型加载的视图(因此在XAML中无需忘记)更多信息可用here

答案 1 :(得分:0)

您可以使用MainForm(需要加载解决方案的人)Loaded事件。

使用Windows.Interactivity EventTrigger将命令附加到Loaded事件。在该命令执行时,加载解决方案。

答案 2 :(得分:0)

我将介绍负责UI工作流程的控制器。他们知道应用程序何时启动并且可以执行命令。这不违反MVVM模式。如果您对此工作感兴趣,那么您可能会发现 WPF Application Framework (WAF) 的示例应用程序很有趣。

答案 3 :(得分:0)

我真的想避免在ViewModel构造函数中调用方法 - 在我看来,构造函数中的激活事件就是这样做的(至少在使用Prism的时候(应该已经提到过)。

我最终做了一件简单的事情,只是在构造结束后在我的主ViewModel上调用一个Loaded方法。

然而,斯科特单挑作为回答者 - 谢谢大家抽出时间。即使我最终选择了另一种方式,我也很感激你的观点。

丹麦安德斯

        var mainViewProvider = ObjectFactory.GetInstance<IMainViewProvider>();
        var mainWindowViewModelProvider = ObjectFactory.GetInstance<IMainWindowViewModelProvider>();

        var mainWindow = mainViewProvider.GetView();
        var mainWindowViewModel = mainWindowViewModelProvider.GetViewModel();
        mainWindow.DataContext = mainWindowViewModel;

        mainWindowViewModel.Loaded(Settings.Default.LoadLatestOnStart);

        mainWindow.Show();

答案 4 :(得分:0)

如果你在代码中设置上下文,那就没关系了,但是如果你是从xaml那里设置的话,那就没关系 - 为了透明和灵活,我们应该考虑支持代码和xaml。

另一种方法可能是在满足某些条件时从xaml触发模型上的某些内容。

我相信故事板可以用于这种方法。

/ Torben Falck,Strongminds,丹麦,www.strongminds.dk