У меня есть 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}" />
Вам не нужно создавать группу. Вам просто нужен простой порядок.
TestList.OrderBy(p => p.Key)
TestList = new ObservableCollection<KeyValuePair<int, string>>(TestList.OrderBy(p => p.Key));
Поскольку ваш источник содержит объекты KeyValuePair
, вы можете предположить, что ключи уже дедуплицированы. Следовательно, группировка бесполезна. Просто держать OrderBy
и, возможно, ваш Where
и вы должны быть хорошо.
new ObservableCollection<KeyValuePair<int, string>>(
TestList.Where(p => p.Key > 0)
.OrderBy(p => p.Key)
);
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));
вместо.