我们在shell的Window标签中有一个Region,在这个区域添加东西会弹出另一个Window。
<Window x:Class="GTS.GRS.N3.Shell.Shell1"
--removed namespace references for clarity
cal:RegionManager.RegionName="{x:Static Constants:RegionNames.WindowRegion}">
我们将ViewModels添加到Region Manager,然后通过数据上下文附加View,以便ViewModel对View一无所知。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<DataTemplate DataType="{x:Type Model:CommunicationViewModel}">
<v:CommunicationView />
</DataTemplate>
</ResourceDictionary>
我的问题是如何关闭弹出窗口,我尝试从RegionManager中删除ViewModel - 但是这个例外...... View是一个UserControl,但我需要关闭它的所有者,这是一个由该区域。我真的不想通过ViewModel的DataContext来破解它。
有人可以帮忙吗?
答案 0 :(得分:3)
安迪,
我花了很长时间才弄明白这一点。
实现这一目标的最简单方法是使用DelegateCommand(或RelayCommand)并在使用window.Show()创建窗口的代码中添加事件处理程序。
// Define the View
Shell window = Container.Resolve<Shell>();
// Define the ViewModel
ShellViewModel windowVM = Container.Resolve<ShellViewModel>();
// When the ViewModel asks to be closed, close the View.
EventHandler handler = null;
handler = (sender, e) =>
{
windowVM.RequestClose -= handler;
window.Close();
};
windowVM.RequestClose += handler;
// Set the ViewModel as the DataContext of the View
window.DataContext = windowVM;
// Display the View
window.Show();
然后我使用复合事件通知窗口的ViewModel(而不是UserControl)它有关闭请求。然后,为复合事件分配的订阅处理程序将调用this.OnRequestClose()
。
在ViewModel的构造函数中:
//subscribe to composite events
_eventAggregator.GetEvent<WindowCloseEvent>().Subscribe(WindowClose);
在ViewModel的主体中:
/// <summary>
/// Private Event handler for WindowCloseEvent.
/// </summary>
private void WindowClose(bool value)
{
// Close the View
this.OnRequestClose();
}
有关更多信息,请参阅Josh Smith在MSDN上关于在http://msdn.microsoft.com/en-us/magazine/dd419663.aspx使用带有WPF的M-V-VM模式的优秀文章。
答案 1 :(得分:0)
_regionManager.Regions [RegionNames.PopupRegion] .Deactivate(_regionManager.Regions [RegionNames.PopupRegion] .ActiveViews.FirstOrDefault());