Jon*_*nna 5 wpf inotifypropertychanged task-parallel-library
我有一个wpf项目,我在一个绑定到文本框的属性上使用INotifyPropertyChanged.我正在使用任务(TaskParallelLibrary)在不同的线程上更新此值.它已正确更新,不会抛出异常.我认为它会抛出异常,因为它运行在后台线程而不是UI线程.当然,如果我直接使用UI元素,它会抛出异常.那么,INotifyPropertyChanged绑定机制是否会自动调度到UI线程?
这是我的属性代码.
private string _textProperty = "";
public string TextProperty
{
get
{
return _textProperty;
}
set
{
if (_textProperty != value)
{
_textProperty = value;
NotifyPropertyChanged("TextProperty");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的任务创建是
var task = new Task(() =>
{
TextProperty = "ABCD"; // Works.
// txtBox.Text = "ABCD"; // Throws an exception.
});
task.Start();
Run Code Online (Sandbox Code Playgroud)
和XAML中的文本框是 <TextBox Name="txtBox" Text="{Binding TextProperty}"/>
我认为它会抛出异常,因为它运行在后台线程而不是UI线程.
WPF允许您在后台线程上设置绑定值.它将为您处理UI线程的编组.
请注意,但是,这并没有对集合的元素工作.ObservableCollection<T>例如,如果要添加到绑定的域,则必须编组回UI线程.但是,有各种解决方法,如果需要,可以简化此操作.请注意,此行为在WPF 4.5中更改,这将在将来简化WPF中的多线程开发.