Как DataGrid связывается со свойствами любой коллекции? - PullRequest
5 голосов
/ 15 сентября 2011

Я делаю пользовательский элемент управления WPF и хочу поведение, подобное элементу управления DataGrid, в смысле привязки. Мой вопрос: как DataGrid может связываться с любой коллекцией типа IEnumerable? Например: вы можете передать DataView как ItemsSource, а также передать любую коллекцию объектов. Как DataGrid решает, привязывать ли столбец DataView или к свойству объекта, только взглянув на это:

<DataGridTextColumn Binding="{Binding **Path=SomePropertyOrColumn**}"/>

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 15 сентября 2011

Это сложный район;ниже приводится разбивка привязки winforms, но я понимаю, что привязка WPF ничем не отличается:

  • для данного объекта первым делом код привязки будет искать IListSource - и еслипоэтому используйте GetList() для получения фактической привязки (именно так таблица данных становится представлением данных для целей привязки)
  • , после этого источник обычно проверяется на ITypedList;это действует как гибкий способ получения псевдо-свойств (GetItemProperties()), представленных моделью;представление данных реализует ITypedList, создавая псевдосвойства для экземпляра
  • , в противном случае может быть возможно идентифицировать очевидный тип данных, что может означать:
    • поиск индексатораформа public SomeType this[int index] {get;} - обратите внимание, что большинство коллекций будет удовлетворять этому
    • (не выполняется winforms, но может быть для WPF), разрешающему путем отражения T в IList<T> или IEnumerable<T>, если объектреализует эти интерфейсы
    • , берущий первый объект (если есть) из sorce и использующий GetType()
  • , когда тип известен, TypeDescriptor.GetProperties(type) может использоватьсяполучить свойства;во многих случаях это будет с помощью отражения, но также возможно добавить косвенный слой (через TypeDescriptionProvider), чтобы предоставить свойства для типа (это может быть добавлено во время выполнения, что может быть очень удобно)
  • в случае индивидуальной привязки (не привязки к списку), есть также TypeDescriptor.GetProperties(obj) - в дополнение к отражению и TypeDescriptionProvider, здесь также есть поддержка ICustomTypeDescriptor, которая может быть реализована отдельным объектом для предоставления пользовательских свойств ввремя выполнения (очень похоже на TypeDescriptionProvider, но с отдельным объектом, принимающим ответственность за свойства)

Я не знаю точно, насколько это относится к привязке WPF, но я уверен, чтообработка IListSource и ITypedList идентична.По памяти, большинство (все?) Стратегий winforms будут работать на WPF - так что это может быть, и изменения будут дополнительные ловушки.

0 голосов
/ 15 сентября 2011

Я думаю, что :

вы можете получить Type элемента его Collection, этот тип Type имеет GetProperties () метод,который возвращает все общедоступные свойства, доступные в его типе, и, после того, как он знает все общедоступные свойства, он может связываться с ними.

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