2010-07-16 16 views
5

Quiero crear un WPF TreeView con dos opciones de agrupación (botones de opción). Por lo tanto, los datos se agruparán de dos maneras diferentes en una jerarquía de dos niveles, siendo el nivel más bajo los elementos de datos reales y los grupos como una forma de representar los datos para facilitar la comprensión.Agrupación de datos en vista de árbol de WPF

También podrían seleccionar elementos por grupo (casillas de verificación) pero ya entendí esa parte, p. si quiero representar objetos de base de datos y quiero agruparlos por esquema o por tipo de objeto (tabla, vista, función, etc.).

Simplemente no sé cómo debería comenzar en los dos modos de agrupación. ¿Debería reestructurar completamente mi ObservableCollection cada vez que cambie el modo de agrupación o hay una manera más directa?

Además, ¿qué ocurre si mi DataTemplate para el 2º nivel sería ligeramente diferente dependiendo del modo de agrupación, por ejemplo, cuando se agrupan por tipo de objeto, necesita visualizar el esquema en el nivel 2?

¿Alguien me puede dar algunos consejos sobre cómo empezar y qué técnicas usar?

Respuesta

3

Agrupe su colección configurando GroupDescriptions en su CollectionViewSource. Puede hacerlo en el código haciendo algo como esto:

CollectionViewSource.GetDefaultView(yourCollection).GroupDescriptions.Add(
    new PropertyGroupDescription("PropertyName")); 

O puede hacerlo en XAML mediante la creación de un CollectionViewSource explícitamente.

<CollectionViewSource 
     Source="{StaticResource yourCollection}" 
     xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"> 
     <CollectionViewSource.GroupDescriptions> 
      <dat:PropertyGroupDescription PropertyName="PropertyName"/> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 

Si está utilizando un ItemsControl llanura como ListBox a continuación, sólo puede establecer la propiedad GroupStyle. Si desea utilizar un TreeView, entonces creo que desea enlazar a la propiedad Groups en ICollectionView. Debe leer las entradas de blog de Bea Stollnitz de agrupación:

+0

Interesante, pero no estoy seguro si puedo usar esto. Necesito casillas de verificación en frente de mis artículos en ambos niveles y comprobar que un grupo debe verificar todos los elementos secundarios, etc. Lo hice ahora con código en mi modelo. Además, si hay una forma de evitar esto, aún necesitaría hacer que PropertyName varíe en la selección de botones de opción, lo cual no se puede hacer porque no es DependencyProperty ... – Koen

+0

@Koen: podría enlazar casillas de verificación al CollectionViewGroup con un convertidor personalizado que verifica cada hijo. Para cambiar la agrupación, podría hacerlo en código, ya sea en el código subyacente o en su ViewModel, o simplemente podría tener dos CollectionViewSources que están agrupados de diferentes maneras y cambiar a cuál enlaza TreeView. – Quartermeister

+6

Ambos enlaces están muertos. –

0

Check this link en HierarchicalDataTemplate. Se dan ejemplos de su uso con varios tipos.

+0

Eso sería de hecho la forma en que lo haría si decido reestructurar toda mi ObservableCollection. Siento que debería haber una técnica más conveniente para esto, como con las consultas LINQ o algo ... – Koen

Cuestiones relacionadas