2013-10-25 2 views
0

Можете ли вы помочь мне настроить сортировку в silverlight, используя PagedCollectionview, сопоставленную с наблюдаемым цветом. Это код, который отлично работает для части сортировки, но не обновляет сетку, поскольку сортировка из первого столбца не очищаетсяПользовательская сортировка в 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; 
    } 

ответ

0

Thanx для вашего ответа Датчанин, но коллекция имеет все данные в строковом формате, мне нужно отсортировать некоторые данные на основе даты, так что мне нужно использовать преобразование в it.hence мне нужны эти манипуляции. внесли несколько изменений в код, поскольку мне нужно обновить сетку. Я использовал методы begindataupdate() - EndDataUpdate(), но это дает мне ошибку. Я считаю, что это из пользовательского интерфейса.

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; 
    } 
+0

Какая ошибка вы получаете? И вы могли бы показать класс данных? Это очень помогло бы. – Danexxtone

+0

thanx Dane для вас. У меня есть обход этой проблемы. Я сортирую коллекцию на основе другого поля – xoanon

1

Похоже, вы слишком много работаете здесь, чтобы реализовать простую сортировку. PagedCollectionView предназначен для фильтрации, сортировки и т. Д. Он будет работать для вас. У вас есть основы, но вам не нужно делать манипуляции с источником, чтобы заставить сортировку работать.

+0

Спасибо за ваш ответ Дани, но коллекция имеет все данные в виде строки, мне нужно сортировать некоторые данные на основе даты и поэтому необходимо использовать преобразование в it.hence мне нужно эти манипуляции . Я сделал несколько изменений в коде, так как мне нужно обновить сетку. Я использовал методы begindataupdate() - EndDataUpdate(), но это дает мне ошибку. Я считаю, что это из пользовательского интерфейса. – xoanon

Смежные вопросы