0

У меня есть View View Collection (CVS), реализованный так же, как вы видите в MSDN или во многих учебниках. В моем случае класс Car и класс Cars Collection, который показан в XAML через поставщика данных об объекте (ODP), связан с этим CVS. Все работает хорошо.Удалить вид из CollectionViewSource C#

Я добавил сортировку, а затем получил ее до стадии, где я мог позволить пользователю выбрать свойство класса Car для сортировки.

Далее Я хочу добавить вторичный вид. Моя проблема заключается не в добавлении сортировки, а в ее удалении. Моя проблема в этом. В моем коде нет вторичной сортировки и не происходит (вторичный контроль отключен), если сначала не существует первичная сортировка. Предположим, что это так, теперь, если я делаю второстепенный вид, он работает, но если я выберу другое свойство для сортировки, ничего не произойдет. Это связано с тем, что добавляется третья сортировка, если я выбираю другое свойство, ничего не происходит (добавляется четвертый вид и т. Д.).

Я не могу найти синтаксис в любом месте, что позволит мне удалить вторичную сортировку, применяемую последним, перед добавлением следующего вторичного сорта.

Учитывая есть только когда-либо две вещи - Primary рода [0] и среднего рода [1], я должен быть в состоянии использовать такой код:

lstCars.Items.SortDescriptions.RemoveAt(1); 

, но это не работает, и даже опустошает мои поля со списком пунктов выбора (не мой фактический вопрос).

Я пытаюсь что-то вроде этого:

lstCars.Items.SortDescriptions.Remove(new SortDescription(cbxSortSecondary.SelectedItem.ToString(), direction)); 

Чтобы удалить фактический элемент из источника, который я знаю, существует потому, что он был поставлен там, когда выбран из вторичного ComboBox. Но пока это должно работать, по какой-то причине это не так.

Ниже приведены некоторые из моего кода:

private void cbxSortPrimary_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     //MessageBox.Show(((ComboBox)sender).Name); 

     //Code to check if sorting is required or not, if so then do it. 
     if(cbxSortPrimary.SelectedIndex == 0)//Sort Off 
     { 
      txtPrimary.Foreground = Brushes.Green; 
      lstCars.Items.SortDescriptions.Clear(); 
      cbxSortSecondary.IsEnabled = false; 
      chkSortSecAsc.IsEnabled = false; 
     } 
     else//Sort On 
     { 
      txtPrimary.Foreground = Brushes.Red; 
      ApplyPrimarySort((bool)chkSortPriAsc.IsChecked); 
      cbxSortSecondary.IsEnabled = true; 
      chkSortSecAsc.IsEnabled = true; 
     } 
    } 

    private void cbxSortSecondary_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     //If there is no primary sort just exit the method. 
     if(cbxSortPrimary.SelectedIndex == 0) return; 

     if(cbxSortSecondary.SelectedIndex == 0)//Sort Off 
     { 
      txtSecondary.Foreground = Brushes.Green; 
      RemoveSecondarySort((bool)chkSortSecAsc.IsChecked); 
     } 
     else//Sort On 
     { 
      txtSecondary.Foreground = Brushes.Red; 
      ApplySecondarySort((bool)chkSortSecAsc.IsChecked); 
     } 
    } 

    private void chkSortPriAsc_Checked(object sender, RoutedEventArgs e) 
    { 
     //Check to see if list is null, if so then exit (nothing to sort). 
     if(lstCars == null) return; 

     if(cbxSortPrimary.SelectedIndex > 0) 
     { 
      if(chkSortPriAsc.IsChecked == true) //Sort Ascending 
      { 
       chkSortPriAsc.Foreground = Brushes.Green; 
       chkSortPriAsc.Content = "Asc"; 
       ApplyPrimarySort((bool)chkSortPriAsc.IsChecked); 
      } 
      else //Sort Decending 
      { 
       chkSortPriAsc.Foreground = Brushes.Red; 
       chkSortPriAsc.Content = "Dec"; 
       ApplyPrimarySort((bool)chkSortPriAsc.IsChecked); 
      } 
     } 
    } 


    private void chkSortSecAsc_Checked(object sender, RoutedEventArgs e) 
    { 
     //Check to see if list is null, if so then exit (nothing to sort). 
     if(lstCars == null) return; 

     //If there is no primary sort just quit. 
     if(cbxSortPrimary.SelectedIndex == 0) return; 

     if(cbxSortSecondary.SelectedIndex > 0) 
     { 
      if(chkSortSecAsc.IsChecked == true) //Sort Ascending 
      { 
       chkSortSecAsc.Foreground = Brushes.Green; 
       chkSortSecAsc.Content = "Asc"; 
       ApplySecondarySort((bool)chkSortPriAsc.IsChecked); 
      } 
      else //Sort Decending 
      { 
       chkSortSecAsc.Foreground = Brushes.Red; 
       chkSortSecAsc.Content = "Dec"; 
       ApplySecondarySort((bool)chkSortPriAsc.IsChecked); 
      } 
     } 
    } 

    private void ApplyPrimarySort(bool asc) 
    { 
     ListSortDirection direction = new ListSortDirection(); 
     //Next determine if the direction of the sort is Ascending or Decending. 
     if(asc) 
      direction = ListSortDirection.Ascending; 
     else 
      direction = ListSortDirection.Descending; 

     //Finally get the property to be sorted on and apply the sort, else remove any existing sorts. 
     lstCars.Items.SortDescriptions.Clear(); 
     lstCars.Items.SortDescriptions.Add(new SortDescription(cbxSortPrimary.SelectedItem.ToString(), direction)); 

     //Then refresh the view. 
     CollectionViewSource.GetDefaultView(lstCars.ItemsSource).Refresh(); 
    } 

    private void ApplySecondarySort(bool asc) 
    { 
     ListSortDirection direction = new ListSortDirection(); 
     //Next determine if the direction of the sort is Ascending or Decending. 
     if(asc) 
      direction = ListSortDirection.Ascending; 
     else 
      direction = ListSortDirection.Descending; 

     lstCars.Items.SortDescriptions.Remove(new SortDescription(cbxSortSecondary.SelectedItem.ToString(), direction)); 
     lstCars.Items.SortDescriptions.Add(new SortDescription(cbxSortSecondary.SelectedItem.ToString(), direction)); 

     //Then refresh the view. 
     CollectionViewSource.GetDefaultView(lstCars.ItemsSource).Refresh(); 
    } 


    private void RemoveSecondarySort(bool asc) 
    { 
     ListSortDirection direction = new ListSortDirection(); 
     //Next determine if the direction of the sort is Ascending or Decending. 
     if(asc) 
      direction = ListSortDirection.Ascending; 
     else 
      direction = ListSortDirection.Descending; 

     lstCars.Items.SortDescriptions.Remove(new SortDescription(cbxSortSecondary.SelectedItem.ToString(), direction)); 
    } 

Esentially Ищу кода, мне нужно сначала удалить предыдущую вторичную сортировку, а затем добавить новый так что всегда есть только два сорта в коллекции посмотреть источник. Если бы я затем расширил это, чтобы разрешить третий, четвертый или любой другой уровень сортировки, всегда будет только такое количество элементов в списке. Однако из-за того, как я его настроил, существует третья степень, если второй уровень не существует. Таким образом, не может быть никакого разнообразия.

Любые идеи о том, как реализовать это, будут устранены.

ответ

1

То, как вы удаляете элементы, неверно: используемый вами Remove method удаляет указанный объект из коллекции (в частности, первый экземпляр указанного объекта), но поскольку вы проходите новый объект, он выиграл 't быть в коллекции и, следовательно, не удаляться.

Ваш лучший выбор - пройти через коллекцию и посмотреть, какой элемент соответствует вашим критериям для удаления и удаления этого предмета.

Например:

 var sortDescriptions = lstCars.Items.SortDescriptions; 

     for (int nI = sortDescriptions.Count; nI >= 0; nI--) 
     { 
      if (sortDescriptions[nI].PropertyName == cbxSortSecondary.SelectedItem.ToString()) 
      { 
       sortDescriptions.RemoveAt(nI); 
      } 
     } 

Update

Альтернативой этой линии:

   sortDescriptions.RemoveAt(nI); 

должен использовать эту линию, но они должны быть функционально эквивалентны:

   sortDescriptions.Remove(sortDescriptions[nI]); 
+0

Вот что я думал. NEW SortDescription не имеет смысла. Итак, как я могу поступать так, как вы заговорили. т. е. у меня есть основной вид на свойство автопроизводителя. Вторичная сортировка по цене. Метод remove требует, чтобы я дал ему SortDescription. Итак, как мне получить идентификатор SortDescription, который я хочу удалить. (в этом случае вторичный). Спасибо за ответ. –

+1

@FrancisRodgers: Это именно то, что ответил на код, который я ответил: он петли, пока не найдет элемент с тем же именем свойства, что и вторичный. –

+0

Извините, я ответил слишком быстро и не видел ваш код. Извиняйтесь и еще раз спасибо за вашу помощь. –