WPF和MVVM Light -通过信使关闭一个特定的子窗口
本文关键字:一个 窗口 Light MVVM -通 信使 WPF | 更新日期: 2023-09-27 18:17:31
在我的项目中,我能够打开多个子窗口,显示并返回来自它们的信息,然后通过单击按钮关闭它们。我遇到的问题是,点击"接受"或"取消"按钮会关闭所有打开的窗口。我需要找到一种方法,只关闭正确的窗口,我还没能弄清楚如何。我正在使用MVVM灯,我认为令牌可能是关键,但我还没有弄清楚如何使它们工作。如果有人能帮助我,我将不胜感激。
在MainWindow中创建子窗口:
Messenger.Default.Register<OpenWindowMessage>(this, message =>
{
var uniqueKey = System.Guid.NewGuid().ToString();
var adventurerWindowVM = SimpleIoc.Default.GetInstance<AdventurerViewModel>(uniqueKey);
adventurerWindowVM.Adv = message.Argument;
var adventurerWindow = new AdventurerView()
{
DataContext = adventurerWindowVM,
Owner = this
};
adventurerWindow.Closed += (sender, args) => SimpleIoc.Default.Unregister(uniqueKey);
adventurerWindow.Show();
});
从adventerviewmodel发送关闭窗口消息:
private void ExecuteAcceptCommand()
{
Messenger.Default.Send(Adv.Name);
Messenger.Default.Send<CloseWindowMessage>(new CloseWindowMessage());
}
在adventerview中接收关闭窗口消息:
Messenger.Default.Register<CloseWindowMessage>(this, x => Close());
标记方法:
你有一个uniqueKey
,你用它生成每个AdventurerView
。当发送CloseWindowMessage
作为令牌时就使用它。
首先在AdventurerViewModel
中添加一个字符串类型的新属性
public string WindowKey { get; set; }
接下来添加一个构造函数来获取AdventureView
中的唯一键。在AdventurerView.xaml.cs
:
public AdventurerView()
:this(string.Empty) {}
public AdventurerView(string uniqueKey) {
InitializeComponent();
Messenger.Default.Register<CloseWindowMessage>(this, uniqueKey, s => Close());
}
MainWindow.xaml.cs
Messenger.Default.Register<OpenWindowMessage>(this, message =>
{
var uniqueKey = System.Guid.NewGuid().ToString();
...
adventurerWindow.Show();
});
Messenger.Default.Register<OpenWindowMessage>(this, message =>
{
var uniqueKey = System.Guid.NewGuid().ToString();
var adventurerWindowVM = SimpleIoc.Default.GetInstance<AdventurerViewModel>(uniqueKey);
adventurerWindowVM.Adv = message.Argument;
adventurerWindowVM.WindowKey = uniqueKey;
var adventurerWindow = new AdventurerView(uniqueKey)
{
DataContext = adventurerWindowVM,
Owner = this
};
adventurerWindow.Closed += (sender, args) => SimpleIoc.Default.Unregister<AdventurerViewModel>(uniqueKey);
adventurerWindow.Show();
});
最后在AdventurerViewModel.xaml.cs
:
private void ExecuteAcceptCommand() {
Messenger.Default.Send(Adv.Name);
Messenger.Default.Send<CloseWindowMessage>(new CloseWindowMessage());
}
private void ExecuteAcceptCommand() {
Messenger.Default.Send(Adv.Name);
Messenger.Default.Send<CloseWindowMessage>(new CloseWindowMessage(), WindowKey);
}
交替:
尽管上面的方法可以很好地工作,但是还有一种替代方法。你的"消息"已经是一个自定义强类型(CloseWindowMessage
)。现在,您可以将WindowKey
添加为消息的一部分,并让每个Window
在接收到新的CloseWindowMessage
时根据自己的密钥和Close()
相应地检查消息中的WindowKey
。