这里有两个问题。
我的视图有一个“关闭”按钮,单击该按钮时,窗口应关闭。我按如下方式处理:我视图中的按钮绑定到视图模型中定义的命令,触发时会运行以下命令:
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来处理新视图。
感谢。
答案 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" />