2010-12-11 29 views
5

我们可以在非UI线程中更新WPF控件的数据上下文吗?WPF线程:我可以在非UI线程中更新控件的数据上下文吗?

说我们有一个LabelMyClass作为数据上下文,并结合ContentMyProperty

<Label Name="label" Content="{Binding MyProperty}" />

其中MyClass很简单:

public class MyClass : INotifyPropertyChanged 
{ 
    int _myField; 
    public int MyProperty 
    { 
     get 
     { 
      return _myField; 
     } 
     set 
     { 
      _myField = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("MyProperty")); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

在非UI线程,我们可以使用myClass.MyProperty = "updated"来更新标签的内容,但我们不能直接执行label.Content = "updated"。那是对的吗?

我自己的答案

这里是我发现:

回答

2

是啊,这是正确的。还有一些额外的注意事项(CollectionChanged事件必须在UI线程中执行)。

通常,您正在使用ObservableCollection<T>绑定到集合。如果您从非UI线程更新此集合,则代码将中断,因为事件是从它们执行的同一线程触发的(ObservableCollection<T>在集合发生更改时触发事件)。为了避免这种情况,您必须提供一个委托给ObservableCollection<T>的定制实现,该定制实现在UI线程中触发事件(使用Dispatcher)。

+0

您能否给我更详细的收藏资料?谢谢。 – Shuo 2010-12-11 20:32:16

+0

谢谢,我想我在这里得到了一个解决方案:http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx – Shuo 2010-12-11 20:38:14

+0

我也使用过这个,但是有些代码不起作用(一些wpf对象不能从DispatcherObject继承)。 – Femaref 2010-12-11 20:46:53