WPF和MVVM Light – 通过Messenger关闭特定的子窗口

在我的项目中,我可以打开多个子窗口,显示和返回信息,然后单击按钮关闭它们。 我遇到的问题是单击“接受”或“取消”按钮将关闭所有打开的窗口。 我需要找到一种只关闭正确窗口的方法,但我无法弄清楚如何。 我正在使用MVVM Light,我认为令牌可能是关键,但我还没弄清楚如何使它们工作。 如果有人能帮助我,我会非常感激。

在MainWindow中创建子窗口:

Messenger.Default.Register(this, message => { var uniqueKey = System.Guid.NewGuid().ToString(); var adventurerWindowVM = SimpleIoc.Default.GetInstance(uniqueKey); adventurerWindowVM.Adv = message.Argument; var adventurerWindow = new AdventurerView() { DataContext = adventurerWindowVM, Owner = this }; adventurerWindow.Closed += (sender, args) => SimpleIoc.Default.Unregister(uniqueKey); adventurerWindow.Show(); }); 

从AdventurerViewModel发送关闭窗口消息:

 private void ExecuteAcceptCommand() { Messenger.Default.Send(Adv.Name); Messenger.Default.Send(new CloseWindowMessage()); } 

在AdventurerView中收到关闭窗口的消息:

 Messenger.Default.Register(this, x => Close()); 

令牌方法:

你有一个uniqueKey你生成每个AdventurerView 。 只需在将CloseWindowMessage作为令牌发送时使用它。

首先在AdventurerViewModel添加一个类型为string的新属性,说“WindowKey”

 public string WindowKey { get; set; } 

接下来添加一个构造函数以在AdventureView获取唯一键。 在AdventurerView.xaml.cs

 public AdventurerView() :this(string.Empty) {} public AdventurerView(string uniqueKey) { InitializeComponent(); Messenger.Default.Register(this, uniqueKey, s => Close()); } 

接下来在MainWindow.xaml.cs

开关

 Messenger.Default.Register(this, message => { var uniqueKey = System.Guid.NewGuid().ToString(); ... adventurerWindow.Show(); }); 

 Messenger.Default.Register(this, message => { var uniqueKey = System.Guid.NewGuid().ToString(); var adventurerWindowVM = SimpleIoc.Default.GetInstance(uniqueKey); adventurerWindowVM.Adv = message.Argument; adventurerWindowVM.WindowKey = uniqueKey; var adventurerWindow = new AdventurerView(uniqueKey) { DataContext = adventurerWindowVM, Owner = this }; adventurerWindow.Closed += (sender, args) => SimpleIoc.Default.Unregister(uniqueKey); adventurerWindow.Show(); }); 

最后在AdventurerViewModel.xaml.cs

开关

 private void ExecuteAcceptCommand() { Messenger.Default.Send(Adv.Name); Messenger.Default.Send(new CloseWindowMessage()); } 

 private void ExecuteAcceptCommand() { Messenger.Default.Send(Adv.Name); Messenger.Default.Send(new CloseWindowMessage(), WindowKey); } 

备用:

即使上述情况完全正常,但这种方法仍有其他选择。 您的“消息”已经是自定义强类型( CloseWindowMessage )。 现在,您可以将WindowKey添加为消息的一部分,并在收到新的CloseWindowMessage时让每个Window检查消息中的CloseWindowMessage ,并根据它自己的密钥和Close()相应的检查。