我们可以在非 UI 线程中更新 WPF 控件的数据上下文吗?
假设我们有一个 Label
有 MyClass
作为数据上下文,并绑定(bind) 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;
}
在非 UI 线程中,我们可以做 myClass.MyProperty = "updated"
更新标签的内容,但我们不能做 label.Content = "updated"
直接地。对吗?
我自己的回答:
这是我发现的:
- 从非 UI 线程,您不能更新控件;
- 从非 UI 线程,您可以更新控件数据上下文的属性;
- 在非 UI 线程中,您不能向
ObserverableCollection
添加或删除项目绑定(bind)到一个控件。但是有一个解决方法:http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx
最佳答案
是的,没错。集合还有其他注意事项(必须在 UI 线程中执行 CollectionChanged
事件)。
通常,您使用的是 ObservableCollection<T>
用于绑定(bind)到集合。如果您从非 UI 线程更新此集合,代码将中断,因为事件是从执行它们的同一线程触发的(ObservableCollection<T>
在集合发生更改时触发事件)。为了避免这种情况,您必须向 ObservableCollection<T>
的自定义实现提供委托(delegate)。这会在 UI 线程中触发事件(使用 Dispatcher)。
关于c# - WPF 线程 : can I update a control's data context in a non-UI thread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4418767/