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容器来处理细节。@看看页面-这就是我要做的。多亏了你的帮助。