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

时间:2015-02-02 20:10:55

标签: c# wpf xaml binding viewmodel

我在这方面看到了很多其他问题,但似乎没有任何问题,因为我的绑定 正在工作,但不是每次都有。

我的XAML中有一个TextBox。

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

它绑定到ViewModel中的Dependency Property()。

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

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

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中。 TextBox保持空白。但是第二次修改它时,两个字符串同时出现。如果所有进度消息最终都显示在一起,那么进度指示器并不多!

我尝试了什么:

我在调试器中介入,并确保确实为两个集合调用了RaisePropertyChanged - 它是。

我添加了Mode=TwoWayUpdateSourceTrigger=PropertyChanged,但无济于事。

问题

那么是什么阻止了TextBox每隔时间显示更新的文本我为ProgressMessages分配了一个新值?

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

1 个答案:

答案 0 :(得分:0)

您可以使用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