簡體   English   中英

從對話框的 VM 外部更新 Caliburn Micro 中的模態對話框

[英]Update modal dialog in Caliburn Micro from outside the dialog's VM

我有以下情況:我正在嘗試將文件加載到應用程序中(這是一個使用 Caliburn Micro 的基於 C# 的 WPF 應用程序)。

此文件的性質並不重要,但加載過程包含許多步驟,對於大文件,可能需要一段時間才能完成。

我想要做的是在我的應用程序中顯示一個模式對話框,該對話框在加載過程開始時顯示,在結束時關閉並在加載過程中由應用程序更新,以便對話框中的文本反映應用程序到達的位置在加載過程中。

我已經通過在調用 windowmanager.ShowDialog() 中傳入關聯的視圖模型來顯示視圖,但隨后什么也沒發生。 我只能假設這是因為對話框可能是同步顯示的,因此永遠不會到達完成加載和更新對話框的后續調用。

本質上,這是我目前正在嘗試的那種事情(VM 有一個在視圖中使用的消息字符串屬性):

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 中的消息文本根據需要進行更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM