2009-09-17 4 views
1

Я работаю над MVP-приложением на основе MVVM, которое использует DataGrid. Сетка привязана по данным к ObservableCollection<Widget> (список Widget). Пользователь должен иметь возможность вставить Widget в список ниже выбранных Widget, чтобы удалить выбранный Widget и изменить порядок Widget s на сетке. Я буду выполнять переупорядочение путем перетаскивания.Рекомендации по WPF DataGrid?

Прежде чем я вникаю в это, я хочу получить реальную проверку моего подхода. Вот что я планирую сделать: класс Widget будет иметь свойство Index, которое будет использовано для заказа списка Widget. Дополнения, удаления и переупорядочения будут выполняться путем манипулирования этим свойством Index, и сортировка будет выполнена в списке Widget, а не через CollectionView.

Перед установкой DataContext список Widget будет отсортирован по значению Index. Когда пользователь добавляет Widget, свойство Index будет увеличиваться на 1 для каждого Widget ниже выбранного элемента в сетке, а новому Widget будет присвоен номер индекса, открытый путем перенумерации. Список Widget прибегает, и привязки будут обновлены.

Когда пользователь удаляет Widget, то Widget будет удален из списка, а Index свойства элементов на сетке ниже удаляемый элемента будет уменьшаются на 1. Widget списка будет прибег и привязки обновились , как указано выше. Переупорядочение будет выполняться как комбинация delete-and-insert.

Вот мой вопрос: Является ли это разумной стратегией для внедрения вставки, удаления и переупорядочения? Есть ли лучший способ сделать это? Любые хорошие статьи или сообщения в блогах по этому вопросу? Я посмотрел, но я ничего не придумал.

Благодарим за помощь.

ответ

1

У меня эта проблема выясняла. Мне нужно свойство Index, но мне не нужно сортировать ObservableCollection. Я создаю интерфейс, IIndexedObject, с одним свойством Index. Я реализую этот интерфейс для любого объекта, который должен быть проиндексирован, и в моей таблице базы данных я добавляю столбец индекса.

Когда я загружаюсь в свою объектную модель, я сортирую таблицу базы данных в свойстве Index. Это гарантирует, что список загружен в том же порядке, что и в последнем прогоне. Я добавляю объекты, используя пустую строку, указанную в нижней части DataGrid. Он дает им индекс 0. Я удаляю объекты, используя кнопку Delete, привязанную к ICommand в модели представления.

Модель моего вида подписывается на свойство CollectionChanged любого ObservableCollection, которое содержит IIndexedObjects. Когда событие срабатывает, модель представления передает коллекцию методу службы ReIndexCollection, который принимает объект IIndexedObject. Метод повторно индексирует коллекцию на основе ее текущего порядка, просто повторяя сбор, присваивая инкрементное целочисленное значение для свойства Index каждого элемента. Когда я сохраню коллекцию обратно в базу данных, значение индекса будет сохранено, чтобы гарантировать, что коллекция будет загружена в том же порядке в следующем прогоне.

Поскольку для загрузки базы данных требуется только сортировка, нет необходимости сортировать ObservableCollection.Когда я перемещаю элементы в DataGrid, он позаботится о повторном заказе коллекции в это время. Все, что мне нужно сделать, - это переиндексировать коллекцию, чтобы ее порядок сохранился в базе данных.

Все в целом, это намного проще, чем я ожидал. Одна из причин, по которой мне нравится WPF и MVVM.

Смежные вопросы