每次引发 PropertyChanged 时,WPF TextBox 都不会在 UI 中更新

WPF TextBox not updating in UI every time PropertyChanged is raised

我看到很多其他问题,但 none 似乎是相关的,因为我的绑定 工作,但不是每次都有效。

我的 XAML 中有一个文本框。

<TextBox TextWrapping="Wrap" Text="{Binding ProgressMessages, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

在ViewModel中绑定了一个Dependency属性()

private string progressMessages;
public string ProgressMessages
{
    get { return progressMessages; }
    set
    {
        progressMessages = value;
        this.RaisePropertyChanged(() => this.ProgressMessages);
    }
}

我有一个方法可以更新 ProgressMessages 两次。此方法绑定到因单击按钮而运行的命令。

private void GenerateInvoices()
{
    ProgressMessages = "Starting execution of Generate Invoices on the HBApp Server";
    int numGenerated = GenerateInvoices(masterProcessId);  // runs for a few seconds
    ProgressMessages += "\n" + numGenerated.ToString() + " invoices have been generated.";
}

问题是,在上述方法中第一次修改 ProgressMessages 时,更改并没有立即反映在 UI 中。文本框保持空白。但是我第二次修改它时,两个字符串同时出现。如果所有进度消息在最后一次全部显示出来,这不是一个进度指示器!

我试过的:

我逐步调试了调试器,并确保确实为两个集合调用了 RaisePropertyChanged - 它是。

我添加了Mode=TwoWayUpdateSourceTrigger=PropertyChanged,但没有用。

问题

那么,是什么阻止了 TextBox 在我每次 为 ProgressMessages 分配新值时 显示更新的文本?

这可能是 Dispatcher 决定将多个 UI 更新合并为一个吗?但我需要它立即更新。

您可以使用 Task.Run 在另一个线程上完成这项工作(您的 UI 线程已锁定,因此在它再次空闲之前您无法看到更改)。

private void GenerateInvoices()
{
   Task.Run(()=>
    {
        ProgressMessages = "Starting execution of Generate Invoices on the HBApp Server";
        int numGenerated = GenerateInvoices(masterProcessId);  // runs for a few seconds
        ProgressMessages += "\n" + numGenerated.ToString() + " invoices have been generated.";
    });
}

如果您需要等到特定任务完成,请考虑使用 async await