2013-12-05 2 views
2

В моей программе у меня есть TreeView узлов, которые мне нужно, чтобы иметь возможность перемещаться вверх и вниз, в основном изменять порядок. Мой TreeView - это ObservableCollection конкретной модели данных. Каждый узел имеет свойство «Ранг», это значение, которое я хотел бы отсортировать. С учетом сказанного я упомянул this question. Из этого вопроса я обнаружил это blog page. Я пытаюсь использовать второй метод, включающий функцию sortList.InvalidOperationException при сортировке ObservableCollection

Это пример того, что я смотрю на:

List<Person> list = new List<Person>(people); 
list.Sort(); 

Пожалуйста, обратите внимание, что «место» значение каждого узла в рабочем состоянии и правильно меняется. Мне просто нужно найти способ переупорядочить сбор, основанный на этом свойстве, и отразить его в представлении.

Моя проблема: При попытке реализовать вышеупомянутое решение я получаю InvalidOperationException. Я чувствую, что не понимаю, как сообщить List для сортировки, основанной на ранге.

Что мой код выглядит следующим образом:

List<TreeModel> sortedTree = new List<TreeModel>(TreeCollection); 
sortedTree.Sort(); 

Что я здесь отсутствует? Как сортировать коллекцию на основе свойства ранга и отражать эти изменения в представлении?

спасибо.

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

ответ

1

Sort бросает InvalidOperationException его компонент типа не имеет сравнения по умолчанию:

компаратор по умолчанию Comparer.Default не может найти реализацию IComparable общего интерфейса или IComparable интерфейса для типа T.

однако вы можете поставить сравнение как first parameter to Sort:

sortedTree.Sort((x, y) => x.Rank.CompareTo(y.Rank)); 

Чтобы передать отсортированную деталь назад к оригинальной коллекции, вы можете либо очистить/заселить CurrentCollection, или просто присвоить ему новый экземпляр (не забудьте RaisePropertyChanged, если вы последний):

CurrentCollection = new ObservableCollection<TreeModel>(sortedTree); 
+0

Ладно, так что это делает его так, что 'list' будет сортировать основан от целого числа, хранящегося в ранге. После этого мне не нужно будет устанавливать текущее 'ObservableCollection' равным новому отсортированному? –

+0

@ Ericafterdark да точно, вам нужно либо создать новый «ObservableCollection», либо очистить/повторно заполнить существующий (первый, вероятно, проще). – McGarnagle

+0

Это то, что я только что сделал: 'CurrentCollection = new ObservableCollection (sortedTree);'. Однако это не влияет на мнение. Может быть, я забыл PropertyChanged? –

1

Вы необходимо пройти property name, на котором вы хотите, чтобы отсортировать список, как это -

sortedTree = sortedTree.OrderBy(m => m.Rank).ToList(); 
Смежные вопросы