【问题标题】:WPF threading: can I update a control's data context in a non-UI thread?WPF 线程:我可以在非 UI 线程中更新控件的数据上下文吗?
【发布时间】:2010-12-11 20:25:04
【问题描述】:

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

假设我们有一个LabelMyClass 作为数据上下文,并将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"。对吗?

我自己的回答

这是我发现的:

【问题讨论】:

    标签: c# wpf multithreading


    【解决方案1】:

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

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

    【讨论】:

    • 您能告诉我更多关于收藏的细节吗?谢谢。
    • 谢谢,我想我在这里找到了解决方案:geekswithblogs.net/NewThingsILearned/archive/2008/01/16/…
    • 我也用过那个,但在某些情况下代码不起作用(某些 wpf 对象不继承自 DispatcherObject)。
    • 那么您能分享任何更好的解决方案吗?
    • 好吧,我的也不理想 - DispatcherInvokeBeginInvoke 作为成员,您可以将它们提供给您的 ViewModel 并随后提供给您的收藏。
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多