作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们可以在非 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"
直接地。对吗?
我自己的回答:
这是我发现的:
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/
我是一名优秀的程序员,十分优秀!