我有一个 wpf 项目,我在绑定到文本框的属性上使用 INotifyPropertyChanged。我正在使用任务(TaskParallelLibrary)在不同的线程上更新此值。它已正确更新并且不会引发异常。我认为它会抛出异常,因为它是在后台线程而不是 UI 线程上运行。当然,如果我直接使用 UI 元素,它会抛出异常。那么,INotifyPropertyChanged 绑定机制是否负责自动分派到 UI 线程?
这是我的属性代码。
private string _textProperty = "";
public string TextProperty
{
get
{
return _textProperty;
}
set
{
if (_textProperty != value)
{
_textProperty = value;
NotifyPropertyChanged("TextProperty");
}
}
}
我的任务创建是
var task = new Task(() =>
{
TextProperty = "ABCD"; // Works.
// txtBox.Text = "ABCD"; // Throws an exception.
});
task.Start();
XAML 中的文本框是<TextBox Name="txtBox" Text="{Binding TextProperty}"/>
我认为它会抛出异常,因为它是在后台线程而不是 UI 线程上运行。
WPF 允许您在后台线程上设置绑定值。它将为您处理 UI 线程的封送处理。
但请注意,这确实not为集合的元素工作。如果您想添加到ObservableCollection<T>
例如,这是绑定的,您必须封送回 UI 线程。有各种解决方法 http://kentb.blogspot.com/2008/01/cross-thread-collection-binding-in-wpf.html但是,如果需要的话,这可以缓解这种情况。注意此行为在 WPF 4.5 中发生变化 http://msdn.microsoft.com/en-us/library/bb613588%28v=vs.110%29.aspx#xthread_access,这将简化未来WPF中的多线程开发。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)