C# WPF&;MVVM指示灯-通过Messenger关闭特定子窗口

C# WPF&;MVVM指示灯-通过Messenger关闭特定子窗口,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,在我的项目中,我可以打开多个子窗口,显示并返回它们的信息,然后单击按钮关闭它们。我遇到的问题是,单击“接受”或“取消”按钮会关闭所有打开的窗口。我需要找到一种方法,只关闭正确的窗口,但我还不知道如何关闭。我正在使用MVVM Light,我认为令牌可能是关键,但我还没有弄清楚如何让它们工作。如果有人能帮助我,我将不胜感激 在主窗口中创建子窗口: Messenger.Default.Register<OpenWindowMessage>(this, message => {

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

在主窗口中创建子窗口:

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();
    });
Messenger.Default.Register(此消息=>
{
var uniqueKey=System.Guid.NewGuid().ToString();
var adventurerWindowVM=SimpleIoc.Default.GetInstance(uniqueKey);
adventurerWindowVM.Adv=message.Argument;
var adventurerWindow=新的AdventurerView()
{
DataContext=adventurerWindowVM,
所有者=此
};
adventurerWindow.Closed+=(发送方,参数)=>SimpleIoc.Default.Unregister(uniqueKey);
adventurerWindow.Show();
});
从AdventurerViewModel发送关闭窗口消息:

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());
}
接收AdventurerView中的关闭窗口消息:

Messenger.Default.Register<CloseWindowMessage>(this, x => Close());
Messenger.Default.Register(这个,x=>Close());

令牌方法:

您有一个
uniqueKey
,可以用它生成每个
AdventurerView
。只需在发送
CloseWindowMessage
时使用它作为标记

首先在
AdventurerViewModel
中添加一个字符串类型的新属性,例如“WindowKey”

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

public AdventurerView()
  :this(string.Empty) {}

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

private void ExecuteAcceptCommand(){
Messenger.Default.Send(Adv.Name);
Messenger.Default.Send(新建CloseWindowMessage(),WindowKey);
}
备选方案:


尽管上述方法可以很好地工作,但也有一种替代方法。您的“消息”已经是自定义的强类型(
CloseWindowMessage
)。现在,您只需将
WindowKey
添加为消息的一部分,并在收到新的
CloseWindowMessage
时,让每个
WindowKey
在消息中对照自己的键检查
WindowKey
,并相应地关闭()。在过去的几天里,你对我的帮助我感激不尽。像你这样的人是StackExchange真正的资产。
public AdventurerView()
  :this(string.Empty) {}

public AdventurerView(string uniqueKey) {
  InitializeComponent();
  Messenger.Default.Register<CloseWindowMessage>(this, uniqueKey, s => Close());
}
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();
    });
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);
}