2011-09-15 14 views
5

Estoy haciendo un control de usuario WPF y quiero un comportamiento similar al control DataGrid en sentido de enlace. Mi pregunta es: ¿cómo sabe DataGrid cómo enlazar a cualquier colección de tipo IEnumerable? Por ejemplo: puede pasar un DataView como ItemsSource, y también puede pasar cualquier colección de objetos. Cómo DataGrid decide si se unen a una columna de DataView, o para una propiedad de objeto sólo por mirar esto:¿Cómo se une DataGrid a las propiedades de cualquier colección?

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

Gracias de antemano.

+0

Compruebe esto 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 y http://stackoverflow.com/questions/4742449/new-to-wpf-data-binding –

+0

@Sandeep GB Esa no era mi pregunta. Sé cómo hacer enlaces, quiero saber cómo DataGrid lo hace internamente con cualquier objeto. – Vale

Respuesta

3

Esta es un área compleja; el siguiente es un desglose del enlace de winforms, pero entiendo que el enlace de WPF no es tan diferente;

  • dado un objeto, el código de unión primero que va a hacer es buscar IListSource - y si es así utilizar GetList() para conseguir la unión real (esto es como una tabla de datos se convierte en una vista de datos con fines de unión)
  • después de eso, la fuente generalmente se comprueba para ITypedList; esto actúa como una forma flexible de obtener pseudo-propiedades (GetItemProperties()) representadas por el modelo; datos-view implementa ITypedList, creando pseudo-propiedades por ejemplo
  • de lo contrario, podría ser posible identificar un tipo obvio para los datos, lo que puede significar:
    • en busca de un indizador de la forma public SomeType this[int index] {get;} - observar que la mayoría colecciones se satisfacen esta
    • (no realizado por winforms, pero podría ser para WPF) resolver a través de la reflexión del T en cualquiera IList<T> o IEnumerable<T> si el objeto implementa las interfaces
    • que toman el primer objeto (si lo hay) de la sorce, y usando GetType()
  • una vez que se conoce un tipo, TypeDescriptor.GetProperties(type) se puede utilizar para obtener propiedades; en muchos casos esto será por reflexión, pero también es posible agregar una capa indirecta (a través del TypeDescriptionProvider) para suministrar propiedades para un tipo (esto se puede agregar en tiempo de ejecución, que puede ser muy conveniente)
  • en el caso de enlace individual (no enlace de lista), también hay TypeDescriptor.GetProperties(obj) - además de reflection y TypeDescriptionProvider, esto también tiene soporte para ICustomTypeDescriptor que puede ser implementado por un objeto individual para proporcionar propiedades personalizadas en tiempo de ejecución (muy similar a TypeDescriptionProvider, pero con el individuo objeto que asume la responsabilidad de las propiedades)

No sé exactamente cuánto de esto se aplica al enlace de WPF, pero estoy bastante seguro de que elEl procesamiento dey ITypedList es idéntico. Desde la memoria, la mayoría (¿todas?) De las estrategias de winforms funcionarán en WPF, por lo que podría ser eso y los cambios son adicionales ganchos.

+0

Gracias, su respuesta me dio la idea de cómo resolver mi problema. – Vale

0

creo que:

usted puede conseguir Type de los elementos de su Collection, este tipo Type tiene GetProperties() método, que devuelve todas las propiedades públicas disponibles en su tipo, y, después de su saber todas las propiedades públicas, se puede unir con ellos.

+0

Sí, pero ¿cómo funciona con DataView? Es una colección de objetos DataRowView, y esos objetos no tienen propiedad de Columna, y aún están vinculados a columnas. – Vale

+0

Creo que este artículo debería ayudar a [MSDN] (http://msdn.microsoft.com/en-US/library/bb669099 (v = VS.100) .aspx). Campo (cadena) - ¿puede usted buscar esto? – stukselbax

Cuestiones relacionadas