gpt4 book ai didi

c# - WPF和MVVM Light-通过Messenger关闭特定的子窗口

转载 作者:行者123 更新时间:2023-12-03 10:29:00 24 4
gpt4 key购买 nike

在我的项目中,我能够打开多个子窗口,显示并从中返回信息,然后单击按钮将其关闭。我遇到的问题是单击“接受”或“取消”按钮会关闭所有打开的窗口。我需要找到一种方法来仅关闭正确的窗口,而我一直无法弄清楚该怎么做。我正在使用MVVM Light,并且我认为 token 可能是关键,但是我还没有弄清楚如何使它们起作用。如果有人可以帮助我,我将不胜感激。

在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();
});

从AdventurerViewModel发送关闭窗口消息:
private void ExecuteAcceptCommand()
{
Messenger.Default.Send(Adv.Name);

Messenger.Default.Send<CloseWindowMessage>(new CloseWindowMessage());
}

在AdventurerView中接收关闭窗口消息:
Messenger.Default.Register<CloseWindowMessage>(this, x => Close());

最佳答案

token 方法:

您有一个uniqueKey,可用来生成每个AdventurerView。仅在发送CloseWindowMessage作为 token 时使用它。

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

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时,根据其自身的 key 和 WindowKey来检查消息中的 Close()

关于c# - WPF和MVVM Light-通过Messenger关闭特定的子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17013161/

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