MVVM窗口/区域处理

时间:2010-09-27 19:56:05

标签: wpf mvvm

这里有两个问题。

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

    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来处理新视图。

感谢。

2 个答案:

答案 0 :(得分:4)

严格来说,ViewModel对代码中的视图一无所知,但是它确实知道了一个RegionManager(好吧,从Container中抓取它),这正在开展工作。

就个人而言,我更喜欢使用中介模式来简单地发布来自ViewModel的消息,例如“好的,我在这里完成”。区域管理器对象将订阅这些消息并根据需要处理关闭。通过这种方式,您已将代码移出ViewModel,并希望您能够更好地了解虚拟机无法“看到”视图。

在Prism中,我们使用一个名为EventAggregator的类来发布/子类CompositeWpfEvent<TPayload>的类

答案 1 :(得分:1)

如果您只想关闭Window,请在XAML中使用IsCancel属性作为Button。

以下是一个例子:

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