我有一个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}"/>
答案 0 :(得分:6)
我认为它会引发异常,因为它在后台线程而不是UI线程上运行。
WPF允许您在后台线程上设置绑定值。它将为您处理UI线程的编组。
但请注意, 不适用于集合的元素。例如,如果要添加到绑定的ObservableCollection<T>
,则必须编组回UI线程。但是,various workarounds可以根据需要简化此操作。请注意this behavior changes in WPF 4.5,这将在未来简化WPF中的多线程开发。
答案 1 :(得分:1)
绑定到单个属性不是线程仿射。您可以毫无问题地执行此操作,绑定将为您执行必要的操作 但请注意,这仅适用于单个属性绑定。如果您有一个ObservableCollection,则无法在另一个线程中添加或删除项目,即使该集合是通过绑定绑定的!