2011-11-03 39 views
5

我有一个wpf项目,我在一个绑定到文本框的属性上使用INotifyPropertyChanged。我正在使用任务(TaskParallelLibrary)在不同线程上更新此值。它被正确更新并且不会抛出异常。我以为它会抛出一个异常,因为它运行在后台线程而不是UI线程。当然,如果我直接使用UI元素,它会抛出异常。那么,INotifyPropertyChanged绑定机制是否会自动调度到UI线程?任务并行库INotifyPropertyChanged不抛出异常?

这是我的代码与属性。

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}"/>

回答

6

我在想它会抛出一个异常,因为它运行在后台线程而不是UI线程。

WPF允许您在后台线程上设置绑定值。它会为你处理UI线程的编组。

但请注意,这是而不是适用于集合的元素。例如,如果你想添加一个绑定的ObservableCollection<T>,你必须重新回到UI线程。有various workarounds,但是,如果需要可以缓解这一点。请注意,this behavior changes in WPF 4.5将在未来简化WPF中的多线程开发。

+1

+1。有趣的链接到WPF 4.5。看起来他们已经整理了一些我不喜欢WPF的东西。 – RichardOD

+0

@Reed你有参考吗?wpf如何为你整理更新? –

1

绑定到单独的属性不是线程仿射。你可以做到这一点没有问题,绑定将为你做必要的。
不过要小心,这只适用于单个属性绑定。如果您有例如ObservableCollection,即使集合通过绑定绑定,您也不能添加或移除另一个线程中的项目!