2010-01-07 16 views

Respuesta

5

Usted puede hacer esto mediante el uso anidado ItemsControls unido a un PagedCollectionView.

Supongo que tengo un origen de datos - MyItems - con campos: Category, Section y Option. Puedo crear un PagedCollectionView desde un IEnumerable(of MyItems) y decirle qué campos agrupar.

Dim original As IEnumerable(Of MyItems) = GetMyItems() 

Dim pcv = New PagedCollectionView(original) 

pcv.GroupDescriptions.Add(New PropertyGroupDescription("Category")) 
pcv.GroupDescriptions.Add(New PropertyGroupDescription("Section")) 

Entonces se me trabó la primera ItemsControl a la PagedCollectionView

hisMyItems.ItemsSource = pcv.Groups 

El PCV crea una jerarquía anidada como:

-Name 
    -Items 

donde Name es el valor en el campo agrupado y Items contiene las filas/objetos en esa agrupación. Supongo que también puedes crear PCV en xaml si lo prefieres.

el XAML sería algo como:

<controls:HeaderedItemsControl x:Name="hisMyItems" Header="{Binding Name}" ItemsSource="{Binding Items}" > 
    <controls:HeaderedItemsControl.ItemTemplate> 
     <DataTemplate> 

      <controls:HeaderedItemsControl Header="{Binding Name}" ItemsSource="{Binding Items}" ItemsPanel="{StaticResource ItemsPanelTemplate1}" > 
       <controls:HeaderedItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Button Content="{Binding Option}" /> 
        </DataTemplate> 
       </controls:HeaderedItemsControl.ItemTemplate> 
      </controls:HeaderedItemsControl> 

     </DataTemplate> 
    </controls:HeaderedItemsControl.ItemTemplate> 
</controls:HeaderedItemsControl> 

espero que tenga sentido. Intenté simplificar las cosas de mi aplicación real, pero podría haber cometido algunos errores al copiarla. Obviamente, también podría usar los controles de elementos normales u otros controles y personalizarlos con plantillas, etc.

0

El control DataGrid apoya agrupación.

Tim Heuer tiene un buen blog sobre la agrupación con una cuadrícula de datos. link text

+0

Sí, lo sé, pero la cuadrícula de datos no es realmente adecuada para lo que deseo. Quiero mostrar un solo control (por ejemplo, Botón) para cada fila, pero estos deben envolver horizontalmente en lugar de verticalmente. Por lo tanto, en ItemsControl puede diseñar el Panel de elementos para usar un panel de distribución pero no veo una manera de hacerlo en la cuadrícula de datos. –

0

Quizás el control que realmente está buscando es el Control Accordian del Toolkit.

Ver muestra del comportamiento Accordian here.

Tenga en cuenta que la apariencia real es tan estilizable como cualquier otro control. La función básica es agrupar categorías de elementos que de otro modo serían una lista directa.

+0

Gracias, voy a echar un vistazo.No estoy seguro de que esto sea compatible con la agrupación de un domaindatasource sin embargo. También necesito más de 1 nivel de agrupación. –

+0

Hmm .. Veo de usted comentar a Stephen su verdadero requerimiento y la pregunta es un poco revelada. No está claro exactamente cómo la idea de "Agrupar" es compatiable con un diseño de estilo "Wrappanel". Le sugiero que edite su pregunta de forma categórica sobre qué UI real desea obtener realmente. – AnthonyWJones

+0

@ AnthonyWJones: He agregado una imagen de lo que intento crear. Estaba buscando un control para hacer esto usando databinding pero parece que voy a tener que escribir un código para crear la UI manualmente. –

Cuestiones relacionadas