Wpf MVVM窗口/区域处理

Wpf MVVM窗口/区域处理,wpf,mvvm,Wpf,Mvvm,这里有两个问题 “我的视图”有一个关闭按钮,单击该按钮时,窗口应关闭。我的处理方式如下:视图中的按钮绑定到视图的视图模型中定义的命令,该命令在被触发时运行以下命令: private void Exit() { var regionManager = Container.Resolve<IRegionManager>(); MyView existingView = regionManager.Regions["MyWindowRegion"].

这里有两个问题

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

    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);
      }
    }
同样的问题。视图模型是否对视图了解得太多

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


谢谢。

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

以下是一个例子:

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

严格地说,ViewModel对代码中的视图一无所知,但它确实了解RegionManager,它从容器中获取视图,而容器正在进行工作

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


在Prism中,我们使用一个名为EventAggregator的类来发布CompositeWpfEvent类型的类,谢谢您的回复。在这种情况下,我喜欢EventAggreator的态度。我的问题是如何做到这一点。我不想用多余的类和中介来拖累我的项目。1你会把这个调解人放在哪里?2如何使用RegionManager?@Shimmy在本例中,我们从静态ServiceLocator样式的容器引入RegionManager。如果您对此感到满意,可以在发布服务器和订阅服务器中使用它。现在单身汉通常都不受欢迎,所以你可以在两者中注入一个IEventAggregator,让一个IoC容器来处理细节。@看看页面-这就是我要做的。多亏了你的帮助。