【问题标题】:MVVM window/region handlingMVVM 窗口/区域处理
【发布时间】:2010-09-28 05:34:52
【问题描述】:

这里有两个问题。

我的视图有一个“关闭”按钮,单击该按钮时,窗口应该关闭。我按如下方式处理:视图中的按钮绑定到视图的视图模型中定义的命令,触发该命令时会运行以下命令:

    private void Exit()
    {
      var regionManager = Container.Resolve<IRegionManager>();
      MyView existingView = regionManager.Regions["MyWindowRegion"].GetView("MyView") as MyView;

      if (existingView != null)
      {
        regionManager.Regions["MyWindowRegion"].Remove(existingView);
      }
    }

这样好吗?视图模型现在是否对视图了解太多(例如它的名称和类型)?

与第一个问题类似,在我的模块工具栏中,如果我点击“启动模块”按钮,它将创建/显示一个视图。我这样做是为了如果视图已经可见,而不是再次创建它,视图模型只会使现有的视图成为焦点:

    private void LaunchMyView()
    {
      var regionManager = Container.Resolve<IRegionManager>();
      MyView existingView = regionManager.Regions["MyWindowRegion"].GetView("MyView") as MyView;

      if (existingView == null)
      {
        MyView view = Container.Resolve<MyView>();
        view.Title = "MyView Title";
        regionManager.Regions["MyWindowRegion"].Add(view, "MyView");
      }
      else
      {
        regionManager.Regions["MyWindowRegion"].Activate(existingView);
      }
    }

同样的问题。视图模型是否对视图了解太多?

顺便说一句,我正在使用WindowsRegionAdapter 来处理新视图的创建。

谢谢。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    严格来说,ViewModel 对代码中的视图一无所知,但它确实知道正在工作的 RegionManager(嗯,从容器中获取它)。

    就个人而言,对于这种事情,我更喜欢使用中介者模式来简单地从 ViewModel 发布消息,例如“OK,我已经完成了”。区域管理器对象将订阅这些消息并酌情处理关闭。通过这种方式,您已将代码从 ViewModel 中移出,希望您能对 VM 无法“看到”视图感到更好。

    在 Prism 中,我们使用一个名为 EventAggregator 的类来发布/订阅 CompositeWpfEvent&lt;TPayload&gt; 类型的类

    【讨论】:

    • 感谢您的回复。在这种情况下,我喜欢 EventAggreator 的态度。我的问题是这将如何实现。我不想让我的项目与多余的课程和调解员混为一谈。 1) 你会把这个中介放在哪里? 2) 你如何让它与 RegionManager 一起工作?
    • @Shimmy 在这个例子中,我们从一个静态的 ServiceLocator 风格的容器中引入了 RegionManager。如果您对此感到满意,则可以在发布者和订阅者中使用它。现在单身人士通常不受欢迎,因此您可以将 IEventAggregator 注入两者,让 IoC 容器处理细节。
    • @看看this页面——这就是我要做的。感谢您的帮助。
    【解决方案2】:

    如果您只想关闭窗口,则在 XAML 中为按钮使用 IsCancel 属性。

    这是一个例子:

    <Button Content="Close"
            IsCancel="True"
            Width="70" 
            Height="23" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多