Shu*_*huo 6 c# wpf multithreading
我们可以在非UI线程中更新WPF控件的数据上下文吗?
假设我们有一个Label有MyClass作为数据上下文,并绑定Content到MyProperty:
<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;
}
Run Code Online (Sandbox Code Playgroud)
在非UI线程中,我们可以myClass.MyProperty = "updated"更新标签的内容,但我们不能label.Content = "updated"直接做.那是对的吗?
我自己的答案:
这是我发现的:
ObserverableCollection绑定到控件的项添加项或从中删除项.但有一个解决方法:http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx是的,这是正确的。集合还有其他注意事项(CollectionChanged事件必须在 UI 线程中执行)。
通常,您用于ObservableCollection<T>绑定到集合。如果从非 UI 线程更新此集合,代码将会中断,因为事件是从执行事件的同一个线程触发的(ObservableCollection<T>当集合发生更改时触发事件)。为了避免这种情况,您必须向自定义实现提供委托,ObservableCollection<T>该委托在 UI 线程中触发事件(使用 Dispatcher)。