首页  >  文章  >  后端开发  >  如何从 WPF 中的非调度程序线程修改 ObservableCollection?

如何从 WPF 中的非调度程序线程修改 ObservableCollection?

Linda Hamilton
Linda Hamilton原创
2024-10-31 20:06:01871浏览

How to Modify an ObservableCollection From a Non-Dispatcher Thread in WPF?

“这种类型的 CollectionView 不支持从与调度程序线程不同的线程更改其 SourceCollection”

问题描述

DataGrid 绑定异步填充的 ObservableCollection 会抛出错误,指出非 Dispatcher 线程不允许对 SourceCollection 进行更改。

解决方案

问题是由线程关联引起的。 ObservableCollection 最初是在 UI 线程上创建的,因此只能从 UI 线程访问它。要从不同的线程修改它,必须将委托放置在 UI Dispatcher 上。

更新了 ViewModel 代码

<code class="csharp">public void Load()
{
    matchList = new List<GetMatchDetailsDC>();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}</code>

通过调用 UI Dispatcher 上的委托,添加到 ObservableCollection安排在 UI 线程上,解决异常。

增强的绑定和刷新

对于 DataGrid 的异步绑定和刷新,请考虑在 ViewModel 属性上使用 INotifyPropertyChanged 并调用 Dispatcher 来刷新UI 元素。

以上是如何从 WPF 中的非调度程序线程修改 ObservableCollection?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn