C# 意外地以相反的顺序获取可观察列表中的项

C# 意外地以相反的顺序获取可观察列表中的项,c#,data-binding,binding,observablecollection,C#,Data Binding,Binding,Observablecollection,我正在使用一个自定义的可观察集合类(积分归Dean Chalke:)来修改来自UI线程以外的线程的数据绑定集合 此自定义可观察集合实现IList和INotifyCollectionChanged,并包含IList类型的集合,该集合存储实际(周围)可观察集合的所有元素 当我将这个定制的可观察集合绑定到一个WPF列表时,可观察列表中的项目被正确显示,除了它们的顺序相反之外 在运行时查看我的代码可以发现,驻留在自定义可观察集合中的IList类型的嵌入式集合的项具有正确的顺序。但当我查看自定义可观察列表

我正在使用一个自定义的可观察集合类(积分归Dean Chalke:)来修改来自UI线程以外的线程的数据绑定集合

此自定义可观察集合实现IList和INotifyCollectionChanged,并包含IList类型的集合,该集合存储实际(周围)可观察集合的所有元素

当我将这个定制的可观察集合绑定到一个WPF列表时,可观察列表中的项目被正确显示,除了它们的顺序相反之外

在运行时查看我的代码可以发现,驻留在自定义可观察集合中的IList类型的嵌入式集合的项具有正确的顺序。但当我查看自定义可观察列表时,它的项目顺序相反

也许我应该发布一些代码来更清楚地说明这一点:)

这是自定义可观察集合:

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();
    }

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

LogList.ItemSource = ViewModel.Log;
除了这个错误的顺序问题之外,一切似乎都很好:线程做他们应该做的事情,WPF列表得到及时更新

同样,当进入代码时,ViewModel的Log对象显示的顺序与此相反,而ThreadSaveObservableCollection中的collection对象的项目顺序正确

我真的很感激任何帮助! 提前谢谢你

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

为什么项目的顺序会有所不同呢

更新:有趣的是,当我使用Add()而不是insert时,外部集合的顺序并没有颠倒过来


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

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

log.Inster(0, "entry1");
创建先进先出的方案

如果你插入

A B C

你会回来的


C B A

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

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

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

您可以在gui管理命令中直接在WPF的代码隐藏中设置SortDescription。

尝试在不绑定数据的情况下使用此集合,例如在单元测试中,并查看是否得到相同的结果。好的,我已经这样做了:当我在不绑定类的情况下使用该类时,该集合会完全按照它应该做的操作。因此,似乎错误的顺序只存在于WPF控件中,并以某种方式通过绑定传播?
yourListView.Items.SortDescriptions.Add( new SortDescription( "yourSourcePropertyToOrderBy", ListSortDirection.Ascending ) );