我在这方面看到了很多其他问题,但似乎没有任何问题,因为我的绑定 正在工作,但不是每次都有。
我的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=TwoWay
和UpdateSourceTrigger=PropertyChanged
,但无济于事。
问题
那么是什么阻止了TextBox每隔时间显示更新的文本我为ProgressMessages
分配了一个新值?
这可能是Dispatcher决定将多个UI更新合并为一个吗?但我需要立即更新。
答案 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。