我正在按照MVVM原则编写WPF应用程序。
我不想在启动时执行命令 - 我对什么是最好的方法有疑问?
ViewModel应该对是否有任何视图无动于衷,对吧?
在VM构造函数中最后做的事情是“ok”吗?或者是否有“应用程序现已启动并运行,所有初始化已完成”的事件,我可以挂钩?
将它连接到视图模型中感觉不对?
稍微具体一点,如果用户在首选项中选择了那个,我想像Visual Studio一样加载“最新解决方案”。如果用户通过GUI手动加载解决方案我在MainFormViewModel中启动流程,我可以在那里的最后一行构造函数中处理负载吗?
有什么想法?
丹麦安德斯
答案 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