【问题标题】:WPF TextBox not updating in UI every time PropertyChanged is raised每次引发 PropertyChanged 时,WPF 文本框都不会在 UI 中更新
【发布时间】:2015-02-02 20:10:54
【问题描述】:

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

我的 XAML 中有一个文本框。

<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 两次的方法。此方法绑定到作为单击按钮的结果运行的命令。

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中。文本框保持空白。但是我第二次修改它时,两个字符串同时出现。如果所有的进度消息在最后一次全部显示出来,这并不是一个进度指示器!

我尝试了什么:

我在调试器中单步执行,并确保确实为两个 Set 调用了 RaisePropertyChanged - 确实如此。

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

问题

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

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

【问题讨论】:

  • 我绝不是专家,但我不希望它能够在 UI 线程被阻塞时更新。
  • @Chris 是对的。您需要异步调用GenerateInvoices()
  • 天哪,感谢您的快速回答。我没有意识到 UI 线程会在这种情况下被锁定。是因为它正在执行附加到按钮的命令吗?我想我认为在代码隐藏中使用 MVVM 而不是 OnClick 以某种方式消除了过去的 UI 锁定。我绝对可以异步完成。谢谢大家!!

标签: c# wpf xaml binding viewmodel


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2011-04-27
    • 2011-12-23
    相关资源
    最近更新 更多