我们能否在非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;
}
在非UI线程中,我们可以使用
myClass.MyProperty = "updated"
来更新标签的内容,但是我们不能直接使用label.Content = "updated"
。这个说法正确吗?我的答案:
以下是我找到的结论:
- 从非UI线程中,您无法更新控件; - 从非UI线程中,您可以更新控件数据上下文的属性; - 从非UI线程中,您无法向绑定到控件的ObservableCollection添加或删除项目。但是有一个解决方法:http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx
Dispatcher
有Invoke
和BeginInvoke
作为成员,你可以将它们提供给你的 ViewModel,然后再提供给你的集合。 - Femaref