【发布时间】: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=TwoWay和UpdateSourceTrigger=PropertyChanged,但无济于事。
问题
那么是什么阻止了 TextBox 显示更新的文本每次我为 ProgressMessages 分配一个新值时?
这可能是 Dispatcher 决定将多个 UI 更新合并为一个吗?但我需要它立即更新。
【问题讨论】:
-
我绝不是专家,但我不希望它能够在 UI 线程被阻塞时更新。
-
@Chris 是对的。您需要异步调用
GenerateInvoices()。 -
天哪,感谢您的快速回答。我没有意识到 UI 线程会在这种情况下被锁定。是因为它正在执行附加到按钮的命令吗?我想我认为在代码隐藏中使用 MVVM 而不是 OnClick 以某种方式消除了过去的 UI 锁定。我绝对可以异步完成。谢谢大家!!
标签: c# wpf xaml binding viewmodel