c# - WPF 线程 : can I update a control's data context in a non-UI thread?

标签 c# wpf multithreading

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

假设我们有一个 LabelMyClass作为数据上下文,并绑定(bind) 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"直接地。对吗?

我自己的回答:

这是我发现的:

最佳答案

是的,没错。集合还有其他注意事项(必须在 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/

相关文章:

C: 如果文件描述符被删除,阻塞读取应该返回

c# - 在 C# 中确定对象 o 是 Action<...> 还是 Func<....>

.net - 作为用户控件或窗口的 View

java - 在 Java 中,如何测试对象的监视器是否使用传统的低级锁定机制锁定?

ios - UserDefaults 线程在 Swift 中安全吗?如何检查?

c# - 将控件绑定(bind)到对象是否算作订阅?

C# using 语句更多理解

c# - 强制预先加载导航属性

C# - 根据类型将对象转换为 IList<T>

c# - Canvas.GetTop() 返回 NaN