gpt4 book ai didi

wpf - WPF Prism (CAL)-当ViewModel一无所知时关闭弹出区域中的窗口

转载 作者:行者123 更新时间:2023-12-03 11:00:56 26 4
gpt4 key购买 nike

我们的 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-但这是异常(exception)... View是一个UserControl,但是我需要关闭其Owner,这是Region所打开的新窗口。我真的不想通过ViewModel的DataContext对其进行破解。

有人可以帮忙吗?

最佳答案

安迪

我花了相当长时间才自己弄清楚这一点。

最简单的方法是使用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();

然后,我使用Composite Event通知窗口的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上的精彩文章,有关在WPF上将M-V-VM模式与WPF一起使用。

关于wpf - WPF Prism (CAL)-当ViewModel一无所知时关闭弹出区域中的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2507890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com