从对话框的 VM 外部更新 Caliburn Micro 中的模式对话框



我有以下情况:我正试图将文件加载到应用程序中(这是一个使用Caliburn Micro的基于c#的WPF应用程序)。

该文件的性质并不重要,但是加载过程包含许多步骤,对于大文件,可能需要一些时间才能完成。

我想做的是在我的应用程序中显示一个模态对话框,在加载过程开始时显示,在结束时关闭,并在此期间由应用程序更新,以便对话框中的文本反映应用程序在加载过程中到达的位置。

我已经通过在调用windowmanager.ShowDialog()中传递关联的视图模型来显示视图,但随后什么也没有发生。我只能假设这是因为对话框可能是同步显示的,所以完成加载和更新对话框的后续调用永远不会到达。

本质上这是我正在尝试的事情(虚拟机有一个单一的消息字符串属性,在视图中使用):

windowManager.ShowDialog(ProgressDialogVM);
doSomething();
ProgressDialogVM.Message = "Step 2";
doSomethingElse();
ProgressDialogVM.Message = "Step 3";
doSomethingElseAgain();
ProgressDialogVM.Message = "Step 4";
ProgressDialogVM.TryClose();

对话框VM中的属性是这样的:

private string message = "";
public string Message
{
get
{
return message;
}
set
{
if (value != message)
{
message = value;
NotifyOfPropertyChange(nameof(message));
}
}
}

最后是用于文本框的XAML,以防这里有关系:

<TextBlock Grid.Row="1" Text="{Binding Path=Message, UpdateSourceTrigger=PropertyChanged}" />

如果你有什么想法,我将不胜感激。

编辑我已经到了可以显示窗口并执行代码的地步。我甚至可以在视图模型中成功地设置属性,并在窗口中显示初始值。然而,现在的问题是,该值虽然可以设置,但在相应的视图中没有更新。它很高兴地显示了初始值,但在此之后没有任何变化。

因此,在下面的测试示例中,窗口将显示'步骤0',但不会更新为显示'步骤1'。

ProgressDialogViewModel ProgressDialogVM = new ProgressDialogViewModel();  
ProgressDialogVM.Message = "Step 0";
windowManager.ShowWindow(ProgressDialogVM, null, null);
ProgressDialogVM.Message = "Step 1";

WindowManager.ShowDialog()打开一个模态窗口,这就是为什么它会阻塞主/父窗口中的进一步操作,直到模态窗口关闭。这就是为什么当ProgressDialogVM打开时,您不能执行第一个代码示例中的后续步骤。

在第二个场景中,您使用了打开非模态窗口的WindowManager.ShowWindow。这允许在主/父窗口中进一步执行代码。但是,后续操作看起来是同步的,因此UI线程无法在ProgressDialogVM上进行UI更新。

你可以做的是确保中间操作如doSomethingElse是异步的。

progressDialogVm.Message = "State 01";
_windowManager.ShowWindow(progressDialogVm,null,null);
await DoSomething();
progressDialogVm.Message = "State 02";
await DoSomethingElse();

这将确保您在ProgressDialog中的Message Text按需要更新。

最新更新