C # / WPF CollectionView - Как добавить элементы в определенной позиции - PullRequest
1 голос
/ 18 июля 2011

Я работаю с ListCollectionView объектами для отображения списков элементов.В настоящее время я создаю экран с двумя из этих списков - один, completeList, содержит все доступные элементы, другой, sortedList, содержит подмножество их с порядком элементов .Соответствующий.Возможные действия:

  • , добавление или удаление любого из элементов completeList в / из sortedList
  • перемещение элементов вверх или вниз в sortedList
  • сохранить содержимое sortedList.

Теперь у меня такой вопрос: есть ли возможность вставить элементы в sortedList в определенной позиции?

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

Предлагает ли ListCollectionView какую-либо такую ​​функциональность или есть другой класс CollectionView, который бы справился?

1 Ответ

2 голосов
/ 18 июля 2011

Вы на самом деле просите что-то, что является логическим противоречием. Предположим, у меня есть ListCollectionView отсортировано в алфавитном порядке:

American
Continental
Festival
Imperial
Tower
Worldwide

Можно ли вставить Luxor между American и Continental? Нет, если вид отсортирован. Есть только одно место, куда может пойти этот предмет. И где оно появляется в представлении , не зависит от того, где оно может появиться в базовом списке .

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

Довольно тривиальный (и общий) способ сделать это - добавить свойство DateTime в класс элемента данных, установить его в DateTime.Now в конструкторе элемента и сделать его последним ключом сортировки, который использует представление , Затем при добавлении нового элемента задайте для его других свойств ключа сортировки значение текущего выбранного элемента. Если вы сделаете это, новые элементы всегда будут появляться в соответствующем месте, если вы не измените значения какого-либо из свойств ключа сортировки.

Сказав, что из других функций, которые вы хотите поддерживать, я считаю, что вам вообще не следует использовать ListCollectionView для того, что вы называете sortedList. Этот список не отсортирован. Это заказано , что совсем не одно и то же. Когда пользователь перемещает элемент вверх в списке, вы действительно хотите изменить его позицию.

Что вы, вероятно, хотите сделать, это реализовать список как ObservableCollection и обернуть его в класс модели представления, который предоставляет Items, SelectedItem, AddNewCommand, MoveUpCommand, MoveDownCommand и SaveCommand свойства. Затем вы можете связать свойства ItemsSource и SelectedItem свойств ListBox или ListView с Items и SelectedItem в классе, а также привязать кнопки или гиперссылки или что-либо в пользовательском интерфейсе к командам. Команды будут манипулировать свойством Items, используя Remove и Insert, и, поскольку Items является ObservableCollection, пользовательский интерфейс будет синхронизирован.

...