Пользовательская коллекция вызывает сбой DataGrid при редактировании

В настоящее время я пытаюсь привязать DataGrid.ItemsSource к пользовательской коллекции RowCollection, которая реализует IList и INotifyCollectionChanged:

Public Class RowCollection(of T)
Implements IList(Of T)
Implements INotifyCollectionChanged
Private _List As New List(Of T)
...

(Извините за код VB, я скоро переведу весь свой код на C #.)

Обратите внимание, что класс не является производным от существующей коллекции CLR. Я создал свой собственный класс, потому что мне нужно переопределить GetItemAt, чтобы реализовать разбиение на страницы. Коллекция Внутренне добавляет и удаляет объекты из своего личного списка _List.

Теперь я могу просматривать элементы в DataGrid, но как только я дважды щелкаю ячейку для редактирования, я получаю InvalidOperationException: «EditItems» недоступно.

У меня вопрос: какие еще интерфейсы я должен реализовать, чтобы моя коллекция была полностью совместима с DataGrid?


person Federico Berasategui    schedule 03.03.2011    source источник
comment
+1 Я помню, что у меня была такая же проблема, но копаться в ней не пытался, потому что не было времени. Насколько я помню, я закончил тем, что использовал ObservableCollection ‹T› в качестве ItemsSource, синхронизируя их с моими собственными коллекциями. Мне любопытно, есть ли у кого-нибудь решение.   -  person HCL    schedule 03.03.2011
comment
Я думаю, что то, что вы пытаетесь сделать, можно сделать проще. Используйте существующую коллекцию, а затем переведите DataGridView в виртуальный режим и реализуйте обработчик CellValueNeeded (object, ... CellEventArgs). Ссылка: msdn.microsoft.com/en- us / library / Цель виртуального режима - поддерживать тот сценарий разбиения по страницам, который вы задумали.   -  person Ritch Melton    schedule 03.03.2011
comment
Прости. Я забыл упомянуть, что использую WPF DataGrid в WPF Toolkit для .Net 3.5. Ссылка, которую вы упомянули, касается WinForms.   -  person Federico Berasategui    schedule 03.03.2011
comment
@HighCore - да, это так. Спасибо за разъяснение, я должен был это заметить.   -  person Ritch Melton    schedule 03.03.2011
comment
@HighCore: Вы приняли ответ Винсента Ванкалберга. Пришлось ли реализовать интерфейс IEditableCollectionView? Это сработало для вас?   -  person HCL    schedule 14.03.2011
comment
@HCL - Да. Фактически, я закончил тем, что использовал обычную ObservableCollection ‹T› и создал производный ListCollectionView, где я определяю настраиваемую логику для извлечения элементов и получения количества элементов. Поэтому я смог создать своего рода виртуализацию данных. Спасибо!   -  person Federico Berasategui    schedule 15.03.2011


Ответы (1)


Здесь вы можете прочитать следующее:

Редактирование

По умолчанию вы можете редактировать элементы прямо в DataGrid. Чтобы гарантировать, что изменения могут быть зафиксированы и отменены правильно, объекты в DataGrid должны реализовывать интерфейс IEditableObject. Кроме того, вы можете установить для свойства IsReadOnly значение true, чтобы отключить редактирование в DataGrid.

Интерфейс IEditableObject находится здесь. Также см. IEditableCollectionView здесь

person Vincent Vancalbergh    schedule 03.03.2011