0

您能帮我使用映射到 observablecollection 的 PagedCollectionview 自定义 Silverlight 中的排序吗?下面是排序部分的代码,但它不会刷新网格,因为第一列的排序未清除

例如。如果我使用“描述”对它进行排序,它可以在两个方向(asc & desc)上工作。但是在使用“描述”对集合进行排序后,如果我单击“类型”标题,它应该使用“类型”清除较早的排序和排序" 仅列。

   private void SortCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Reset)
            return;
        if (e.Action == NotifyCollectionChangedAction.Replace || e.Action == NotifyCollectionChangedAction.Add)
        {
            MyPVC.SortDescriptions.Clear();
            if (e.NewItems.Count > 0)
            {
                MyPVC.SortDescriptions.Clear();
                SortDescription sd = (SortDescription) e.NewItems[0];
                if (sd.PropertyName == "description")
                {
                    e.NewItems.Clear();
                    using (MyPVC.DeferRefresh())
                    {
                        ObservableCollection<MyClass> source = ((ObservableCollection<MyClass>)MyPVC.SourceCollection);
                        if (source == null)
                            return;
                        bool asc = (sd.Direction == ListSortDirection.Ascending);
                        var source1 = new List<MyClass>(source);
                        source1.Sort((a, b) =>
                        {
                            int left = 0;
                            int right = 0;
                            var ret = 0;
                            if (int.TryParse(a.description, out left) && int.TryParse(b.description, out right))
                            {
                                ret = (left < right) ? -1 : (left == right) ? 0 : 1;
                                if (!asc)
                                    ret = -ret;
                            }

                            return ret;
                        });

                        var newsource = new ObservableCollection<MyClass>(source1);
                        MyPVC = new PagedCollectionView(newsource);
                        ((INotifyCollectionChanged)MyPVC.SortDescriptions).CollectionChanged += SortCollectionChanged;
                        MyPVC.SortDescriptions.Clear();
                    }
                    MyClassDataGrid.ItemsSource = MyPVC;
                    MyPVC.Refresh();

                }
                if (sd.PropertyName == "Type")
                {
                    MyPVC.SortDescriptions.Clear();
                    //MyPVC = new PagedCollectionView(MyPVC);
                    e.NewItems.Clear();
                    using (MyPVC.DeferRefresh())
                    {
                        ObservableCollection<MyClass> source = ((ObservableCollection<MyClass>)MyPVC.SourceCollection);
                        if (source == null)
                            return;
                        bool asc = (sd.Direction == ListSortDirection.Ascending);
                        var source1 = new List<MyClass>(source);
                        source1.Sort((a, b) =>
                        {
                            int left = 0;
                            int right = 0;
                            var ret = 0;
                            if (int.TryParse(a.Type, out left) && int.TryParse(b.Type, out right))
                            {
                                ret = (left < right) ? -1 : (left == right) ? 0 : 1;
                                if (!asc)
                                    ret = -ret;
                            }

                            return ret;
                        });

                        var newsource = new ObservableCollection<MyClass>(source1);
                        MyPVC = new PagedCollectionView(newsource);
                        ((INotifyCollectionChanged)MyPVC.SortDescriptions).CollectionChanged += SortCollectionChanged;

                        MyPVC.SortDescriptions.Clear();
                    }
                }
            }
        }
    }
    private void MyClasstableView_ColumnHeaderClick(object sender, ColumnHeaderClickEventArgs e)
    {
        ((INotifyCollectionChanged) MyPVC.SortDescriptions).CollectionChanged += SortCollectionChanged;
    }
4

2 回答 2

1

看起来您在这里做了太多工作来实现简单的排序。PagedCollectionView 旨在过滤、排序等。它将为您完成工作。您拥有正确的基础知识,但您不必为了使排序工作而进行源操作。

于 2013-10-25T19:03:34.680 回答
0

感谢您的回复 Dane,但该集合包含字符串格式的所有数据,我还需要根据日期对一些数据进行排序,因此我需要在其中使用转换。因此我需要这些操作。我做了一些更改代码,因为我需要更新网格我使用了 begindataupdate()-EndDataUpdate() 方法,但它给了我一个错误。我相信这是来自 UI。

   private void SortCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.Action == NotifyCollectionChangedAction.Remove || e.Action == NotifyCollectionChangedAction.Reset)
            return;
        if (e.Action == NotifyCollectionChangedAction.Replace || e.Action == NotifyCollectionChangedAction.Add)
        {
            MyPVC.SortDescriptions.Clear();
            if (e.NewItems.Count > 0)
            {
                MyPVC.SortDescriptions.Clear();
                SortDescription sd = (SortDescription) e.NewItems[0];
                if (sd.PropertyName == "description")
                {
                    e.NewItems.Clear();
                    using (MyPVC.DeferRefresh())
                    {
                        ObservableCollection<MyClass> source = ((ObservableCollection<MyClass>)MyPVC.SourceCollection);
                        if (source == null)
                            return;
                        bool asc = (sd.Direction == ListSortDirection.Ascending);
                        var source1 = new List<MyClass>(source);
                        source1.Sort((a, b) =>
                        {
                            int left = 0;
                            int right = 0;
                            var ret = 0;
                            if (int.TryParse(a.description, out left) && int.TryParse(b.description, out right))
                            {
                                ret = (left < right) ? -1 : (left == right) ? 0 : 1;
                                if (!asc)
                                    ret = -ret;
                            }

                            return ret;
                        });

                        var newsource = new ObservableCollection<MyClass>(source1);
                        MyPVC = new PagedCollectionView(newsource);
                        //((INotifyCollectionChanged)LeasePVC.SortDescriptions).CollectionChanged += SortCollectionChanged;

                        //LeasePVC.Refresh();
                        LeasePVC.SortDescriptions.Clear();

                        this.MyClassDataGrid.BeginDataUpdate();
                        this.MyClassDataGrid.ItemsSource = MyPVC;
                        this.MyClassDataGrid.EndDataUpdate();
                    }


                }
                if (sd.PropertyName == "Type")
                {
                    MyPVC.SortDescriptions.Clear();
                    //MyPVC = new PagedCollectionView(MyPVC);
                    e.NewItems.Clear();
                    using (MyPVC.DeferRefresh())
                    {
                        ObservableCollection<MyClass> source = ((ObservableCollection<MyClass>)MyPVC.SourceCollection);
                        if (source == null)
                            return;
                        bool asc = (sd.Direction == ListSortDirection.Ascending);
                        var source1 = new List<MyClass>(source);
                        source1.Sort((a, b) =>
                        {
                            int left = 0;
                            int right = 0;
                            var ret = 0;
                            if (int.TryParse(a.Type, out left) && int.TryParse(b.Type, out right))
                            {
                                ret = (left < right) ? -1 : (left == right) ? 0 : 1;
                                if (!asc)
                                    ret = -ret;
                            }

                            return ret;
                        });

                        var newsource = new ObservableCollection<MyClass>(source1);
                        MyPVC = new PagedCollectionView(newsource);
                        //((INotifyCollectionChanged)LeasePVC.SortDescriptions).CollectionChanged += SortCollectionChanged;

                        //LeasePVC.Refresh();
                        LeasePVC.SortDescriptions.Clear();

                        this.MyClassDataGrid.BeginDataUpdate();
                        this.MyClassDataGrid.ItemsSource = MyPVC;
                        this.MyClassDataGrid.EndDataUpdate();
                    }
                }
            }
        }
    }
    private void MyClasstableView_ColumnHeaderClick(object sender, ColumnHeaderClickEventArgs e)
    {
        ((INotifyCollectionChanged) MyPVC.SortDescriptions).CollectionChanged += SortCollectionChanged;
    }
于 2013-10-28T05:18:39.930 回答