每次引发 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=TwoWay
和UpdateSourceTrigger=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。
我看到很多其他问题,但 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=TwoWay
和UpdateSourceTrigger=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。