2011-09-15 5 views
5

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

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

Спасибо заранее.

+0

Проверьте этот http: // stackoverflow.com/questions/5488014/in-wpf-are-binding-path-and-binding-really-equal, http://stackoverflow.com/questions/3504480/when-to-use-path-in-wpf-binding и http://stackoverflow.com/questions/4742449/new-to-wpf-data-binding –

+0

@Sandeep GB Это не мой вопрос. Я знаю, как сделать привязку, я хочу знать, как DataGrid делает это внутренне с любым объектом. – Vale

ответ

3

Это сложный район; следующее разбиение на привязку 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

Спасибо, ваш ответ дал мне идею, как решить мою проблему. – Vale

0

Я думаю, что:

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

+0

Да, но как это работает с DataView? Это коллекция объектов DataRowView, и эти объекты не имеют свойства столбца, и они по-прежнему привязаны к столбцам. – Vale

+0

Я думаю, что эта статья должна помочь [MSDN] (http://msdn.microsoft.com/en-US/library/bb669099 (v = VS.100) .aspx). Поле (строка) - возможно, вы ищете это? – stukselbax

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