【发布时间】:2019-02-17 20:27:59
【问题描述】:
您可以在下面看到我的引导程序。我想从引导程序注册所有视图。 当我启动应用程序时,会创建 WebView 和 EditView。 GeneralView 是 EditView 的一部分,我必须先导航到 EditView 才能实例化它。 启动可执行文件时如何实例化所有视图?
class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
// Register views
IRegionManager regionManager = this.Container.Resolve<IRegionManager>();
regionManager.RegisterViewWithRegion("ContentRegion", typeof(WebView));
regionManager.RegisterViewWithRegion("ContentRegion", typeof(EditView));
// The following view is instantiated for the first time when I navigate to EditView
regionManager.RegisterViewWithRegion("GeneralRegion", typeof(GeneralView));
return Container.Resolve<MainWindow>();
}
protected override void InitializeShell()
{
Application.Current.MainWindow.Show();
}
protected override void InitializeModules()
{
base.InitializeModules();
}
}
【问题讨论】:
-
为什么要在视图显示之前对其进行实例化?
-
因为我在视图模型之间使用 EventAggregator 来发送消息和更新数据。
-
所以?这不能回答问题。视图在显示在屏幕上之前不会被初始化。
-
但是EditView被初始化了,没有显示在屏幕上。如果视图未初始化,则数据不正确。我应该创建新事件来询问数据。我想知道是否有其他解决方案。
-
当然不是。这就是通过事件聚合器发送事件的本质。您不知道是否有人会订阅您发送的事件 - 而且您不想知道。如果您依赖所有正在处理的事件,您可能应该考虑使用您在引导程序中实例化为单例的共享服务。如果一个视图模型在发送消息时期望另一个视图模型处于活动状态,那么它们之间毕竟存在间接耦合。使用事件聚合器的目的是消除这种紧密耦合。