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

Shu*_*huo 6 c# wpf multithreading

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

假设我们有一个LabelMyClass作为数据上下文,并绑定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;
}
Run Code Online (Sandbox Code Playgroud)

在非UI线程中,我们可以myClass.MyProperty = "updated"更新标签的内容,但我们不能label.Content = "updated"直接做.那是对的吗?

我自己的答案:

这是我发现的:

Fem*_*ref 4

是的,这是正确的。集合还有其他注意事项(CollectionChanged事件必须在 UI 线程中执行)。

通常,您用于ObservableCollection<T>绑定到集合。如果从非 UI 线程更新此集合,代码将会中断,因为事件是从执行事件的同一个线程触发的(ObservableCollection<T>当集合发生更改时触发事件)。为了避免这种情况,您必须向自定义实现提供委托,ObservableCollection<T>该委托在 UI 线程中触发事件(使用 Dispatcher)。