2009-07-27 1 views
1

У меня есть вспомогательный класс, который реализует ITypedList, чтобы предоставить объекты для привязки данных к пользовательским коллекциям.Альтернатива ITypedList?

Мое осуществление позволяет мне легко указать, что я хочу, чтобы под-свойства объектов были доступны для привязки данных, например, я могу привязываться к «Идентификатор», «Имя», а также «Дети.Count».

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

Метод, который он вызывает, имеет параметр, который может использоваться для указания того, какие объекты-объекты-получатели будут извлекаться, но для класса .NET DataGridView он всегда является нулевым, что означает, что мне просто нужно вернуть все объекты, которые у меня есть.

Итак, мой вопрос в этом. Есть ли альтернатива ITypedList, которую я могу реализовать, где мне будет ясно сказано, какие свойства интересует сетка, так что мне не нужно предварительно заполнять коллекцию объектов acccessor?

Вот что мой код выглядит сейчас:

var wrapper = new TypedListWrapper<Person>(someNormalCollectionClass); 
wrapper.BindableProperties = "Id;Name;Children.Count"; 
grid.DataSource = wrapper; 

вот то, что я хочу, чтобы это выглядело как:

grid.DataSource = new TypedListWrapper<Person>(someNormalCollectionClass); 

Любые берущих?

+0

Если я правильно понял ваш вопрос, вы ищете способ уменьшить количество экземпляров 'PropertyDescriptor', которые вы возвращаете, если базовый тип имеет больше свойств, чем сетка фактически привязана. Это верно? –

+0

Да, потому что, чтобы избежать необходимости указывать список связующих свойств, мне просто нужно было бы заполнить его всем, на что я мог бы попасть. –

ответ

4

Если бы вы создали свою собственную сетку, то, конечно, вы могли бы реализовать такие функции, как это, но не с DataGridView (или, я бы предположил, любой текущий сторонний элемент управления сеткой). Я также опасаюсь ограничений времени разработки. Если вы инициируете инициализацию PropertyDescriptor, то я предлагаю загружать отдельные объекты PropertyDescriptor только с именем и типом и использовать объект объекта, заставляя его загружать любую другую информацию, которая может потребоваться.

В целом, однако, это должны быть недорогие операции. Если у вас возникло беспокойство по поводу вашей способности получить список свойств за разумное время, вам может потребоваться изучить, где узкое место находится в вашей архитектуре, и попытаться найти способ его решения. Тем не менее, я не вижу возможности для вас. Система привязки данных по своей конструкции является потребительской агностикой. Нет никаких средств для обязательного потребителя указать, намерен ли он использовать дескриптор или нет. Наличие чего-то подобного было бы настоящей головной болью с курицей или яйцом.

+0

Проблема заключается не в использовании объектов, а в основном, сколько я должен добавить. Я мог бы добавить все свойства объекта, который я добавляю в список, но тогда, что о свойствах, которые сами возвращают объекты, я должен добавить все это? А как насчет свойств объектов, возвращающих объекты? Где я должен остановиться? –

+0

Хороший ответ Адам, но вы можете мне что-то прояснить? В подписи 'ITypedList.GetItemProperties (PropertyDescriptor [] listAccessors)', какова цель аргумента 'listAccessors'? В моих реализациях я проигнорировал его и возвратил все свойства, которые я хочу раскрывать, но похоже, что целью этого аргумента было определение потребителем конкретных свойств, на которые они действительно заинтересованы. Документы говорят: _В массиве System ,Объекты ComponentModel.PropertyDescriptor для поиска в коллекции как связываемые. Это может быть null._ –

+0

@ Дрю: Я не мог сказать вам. Хотя я не делал исчерпывающих исследований, я никогда не видел, чтобы кто-нибудь их использовал (и, если я правильно помню, класс DataView также игнорирует это, но не цитируйте меня на этом). –