Как отсортировать коллекцию ObservableCollection <KeyValuePair <int, string>

1

У меня есть ObservableCollection<KeyValuePair<int, String>>() именем TestList, связанный в текстовом поле, и я хочу сортировать коллекцию по int. Я пробовал следующее, но он не сортировал коллекцию:

new ObservableCollection<KeyValuePair<int, string>>(
                 TestList .Where(p => p.Key > 0)
                 .GroupBy(p => p.Key)
                 .Select(grp => grp.First())
                 .OrderBy(p => p.Key)
                 );

Как я могу сортировать коллекцию? И будет ли Связывание все еще работать?

EDIT (тоже не работает):

public ObservableCollection<KeyValuePair<int, String>> TestList
{
    get { return testList; }
    set {
        testList = value;
        NotifyPropertyChanged("TestList");
    }
}

public void Test(int index)
{
    TestList.RemoveAt(index);
    TestList = new ObservableCollection<KeyValuePair<int, string>>(TestList.OrderBy(p => p.Key));
}

и графический интерфейс:

<TextBox Grid.Column="0" IsReadOnly="True"
Text="{Binding Path=Value , Mode=OneWay}" />
  • 0
    Ваш запрос вернет первую группу, отсортированную по ключу, что вы хотите от нее сделать?
  • 0
    TestList.RemoveAt(index); вызовет получатель, а не установщик, поэтому NotifyPropertyChanged("TestList") вызываться не будет. Подключите что-нибудь к событию CollectionChanged, если вы хотите уведомить об изменениях коллекций. TestList.OrderBy(p => p.Key); возвращает новый отсортированный IEnuemrable<KeyValuePair<int, String>> который вы отбрасываете, он не изменяет список на месте. Вам нужно сделать что-то вроде TestList = new ObservableCollection<KeyValuePair<int, string>>(TestList.OrderBy(p => p.Key)); вместо.
Показать ещё 2 комментария
Теги:
sorting
wpf
observablecollection

2 ответа

5
Лучший ответ

Вам не нужно создавать группу. Вам просто нужен простой порядок.

TestList.OrderBy(p => p.Key)
  • 0
    Я установил точку останова после вашей строки, моя коллекция не отсортирована, и Property TestList не был запущен. Я обновил свой вопрос с некоторым кодом
  • 0
    @Stampy, что имел в виду Христос: TestList = new ObservableCollection<KeyValuePair<int, string>>(TestList.OrderBy(p => p.Key));
Показать ещё 3 комментария
1

Поскольку ваш источник содержит объекты KeyValuePair, вы можете предположить, что ключи уже дедуплицированы. Следовательно, группировка бесполезна. Просто держать OrderBy и, возможно, ваш Where и вы должны быть хорошо.

new ObservableCollection<KeyValuePair<int, string>>(
             TestList.Where(p => p.Key > 0)
             .OrderBy(p => p.Key)
             );

Ещё вопросы

Сообщество Overcoder
Наверх
Меню