【问题标题】:How to instantiate all the views in Prism如何实例化 Prism 中的所有视图
【发布时间】: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被初始化了,没有显示在屏幕上。如果视图未初始化,则数据不正确。我应该创建新事件来询问数据。我想知道是否有其他解决方案。
  • 当然不是。这就是通过事件聚合器发送事件的本质。您不知道是否有人会订阅您发送的事件 - 而且您不想知道。如果您依赖所有正在处理的事件,您可能应该考虑使用您在引导程序中实例化为单例的共享服务。如果一个视图模型在发送消息时期望另一个视图模型处于活动状态,那么它们之间毕竟存在间接耦合。使用事件聚合器的目的是消除这种紧密耦合。

标签: c# wpf prism prism-6


【解决方案1】:

视图在实际显示在屏幕上之前不应被实例化。此外,视图应该只定义用户界面。

如果您在使用来自另一个视图模型的事件聚合器发送事件时希望特定视图模型处于活动状态,那么您实际上是在这两个视图模型之间引入了间接耦合。这正是您首先要通过使用事件聚合器来避免的。

因此,如果您依赖所有正在处理的事件,您可能应该考虑使用在引导程序中作为单例实例化的共享服务。然后,您可以使用此共享服务注入您的视图模型,并通过服务接口在它们之间进行通信。

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多