我有一个通用的模态对话框视图,它从viewmodels调用,如下所示:
NotificationMessageViewModel vm = new NotificationMessageViewModel()
{
MessageContent = jobExistMsg,
MessageHeader = "Warning",
MessageType = NotificationMessageType.Warning,
Type = ModalType.OkCancel
};
mainEntity.ModalContent = vm;
vm.CloseRequested += ImportJobConfirmation_CallBack;
这种方法的问题是,我不能在while
循环中使用此代码,因为代码执行会忽略CloseRequested
事件。目前的解决方法是,我有CloseRequested
的回调函数,我在callback
函数内再次为循环中的其他项调用相同的函数。所以它的递归调用。
有没有更好的解决方案来处理这种情况?
我编辑了一点代码。 假设我有10条记录,我希望在循环处理时存在的每条记录都有这个模态弹出窗口。如果我将在while循环中编写此代码,我将只看到10个记录的弹出窗口,并且关闭请求将仅被触发一次,因为我应该获得每个现有记录的模态(比如5个现有记录)。
答案 0 :(得分:1)
您可以使用async / await
组合来获得所需内容。我刚刚用一个普通的窗口实现了它,但你可以很容易地调整它以使用视图模型。
在辅助窗口(您的案例中为视图模型)中,提供一个等待显示窗口的方法:
public partial class Window1 : Window
{
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
public Window1()
{
InitializeComponent();
this.Closed += Window1_Closed;
}
void Window1_Closed(object sender, EventArgs e)
{
tcs.SetResult(null);
}
public async Task ShowAsync()
{
Show();
await tcs.Task;
}
}
然后在调用窗口中,您可以连续显示任意数量的窗口,并等待它们关闭:
async void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 10; ++i)
{
var secondaryWindow = new Window1();
await secondaryWindow.ShowAsync();
}
}
如果您愿意,还可以在tcs.Task
的属性中公开{{1}}。这样可以让您更灵活。 E.g:
Window1
其中
var secondaryWindow = new Window1();
secondaryWindow.Show();
await secondaryWindow.WaitForCloseTask;