Лучшие практики WPF DataGrid? - PullRequest
1 голос
/ 18 сентября 2009

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

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

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

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

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

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

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

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

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

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

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

0 голосов
/ 18 сентября 2009

Улучшение производительности сортировки: http://blogs.msdn.com/jgoldb/archive/2008/10/30/improving-microsoft-datagrid-sorting-performance-part-3.aspx

...