0

为了_ _从 UI 线程以外的线程修改数据绑定集合。

这个自定义的 observable 集合实现了 IList<> 和 INotifyCollectionChanged 并包含一个 IList<> 类型的集合,它存储了实际(周围)observable 集合的所有元素。

当我将此自定义可观察集合数据绑定到 WPF 列表时,可观察列表的项目将正确显示,但它们的顺序相反!

在运行时查看我的代码会发现,位于自定义可观察集合内的 IList<> 类型的嵌入式集合的项目具有正确的顺序。但是当我查看自定义可观察列表时,它的项目顺序相反。

也许我应该发布一些代码以使这一点更清楚:)

这是自定义的 observable 集合:

public class ThreadSaveObservableCollection <T> : IList<T>, INotifyCollectionChanged {

     private IList<T> collection;

     public ThreadSaveObservableCollection () {

         collection = new List<T>();
     }

     ...

     public void Insert (int index, T item) {

        if (Thread.CurrentThread == uiDispatcher.Thread) {

            insert_(index, item);
        } else {

            uiDispatcher.BeginInvoke(new Action<int, T>(insert_), DispatcherPriority.Normal, new object[] {index, item});
        }
    }

    private void insert_ (int index, T item) {

        rwLock.AcquireWriterLock(Timeout.Infinite);

        collection.Insert(index, item);
        CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, item));

        rwLock.ReleaseWriterLock();
    }

    ...
}

这是我在 ViewModel 中使用集合的地方:

...
public ThreadSaveCollection Log {get; set;}

public ViewModel () {

    Log = new ThreadSaveCollection();
}
...

public void Insert() {

     log.Instert(0, "entry1");
}

我动态创建对象日志和 WPF 控件之间的绑定:

LogList.ItemSource = ViewModel.Log;

除了这个错误的顺序问题,一切似乎都很好:线程做他们应该做的事情,WPF 列表会及时更新。

再次进入代码时,ViewModel 的 Log 对象向我显示了相反的顺序,而 ThreadSaveObservableCollection 中的集合对象具有正确顺序的项目。

我真的很感激任何帮助!先感谢您 ...

更新:语句 log.Instert(0, "entry1"); 是故意的,因为我想要一个随着时间的推移获取项目的列表,并且每个新项目都应该插入到列表的开头。换句话说,最新的项目总是在列表的顶部。尽管如此,在我的代码中,嵌入式集合具有所需的顺序,而周围的集合则没有。

无论如何,为什么项目的顺序应该有所不同?

更新:有趣的是,当我使用 Add() 而不是 insert 时,订单不会从外部集合中反转。

换句话说:无论我使用 Add(item) 还是 Insert(0, item),我总是在 ViewModel 的 ThreadSaveObservableCollection 对象中获得相同的项目顺序,而其中包含的集合具有正确的顺序。

4

3 回答 3

1

您似乎总是在索引 0 处插入新记录

log.Inster(0, "entry1");

创建一个先进先出的场景。

如果你插入

甲乙丙

你会回来的

CBA

于 2012-06-07T16:25:10.960 回答
0

要在 WPF 组件中获得正确的顺序,可以使用 SortDescription:

yourListView.Items.SortDescriptions.Add( new SortDescription( "yourSourcePropertyToOrderBy", ListSortDirection.Ascending ) );

您可以直接在 WPF 后面的代码中在您的 gui-management oder 中设置 SortDescription。

于 2014-02-07T13:06:18.590 回答
0

当您调用时,Insert(0, "entry1")您将新值放在列表的开头,这就是顺序颠倒的原因。您可以改用 Add 方法。

于 2012-06-07T16:25:18.600 回答