2010-10-25 7 views
0

Je dois appliquer le regroupement aux lignes d'un DataGrid imbriqué dans un TabControl. Les deux DataGrid et TabControl sont databound. Le contrôle le plus externe est lié à un ViewModel qui expose une collection de pages liée au TabControl. Chaque page expose une collection de lignes liées au Grid. Je suis essayé de suivre des modèles comme this one from SO et this one from C-SharpCorner. Je ne suis pas marié à ceux-ci, donc s'il y a un meilleur modèle (as this post seems to indicate), je suis prêt à aller dans une autre direction.WPF Regroupement d'un DataGrid imbriqué dans les onglets de la base de données

Pour l'instant, je ne sais pas où injecter la définition du PropertyGroupDescription et le lier à mon désiré PropertyName. J'ai essayé de le faire comme une ressource et directement comme un CollectionViewSource sur le DataGrid. Mais aucun n'a produit de résultats raisonnables.

C'est ce que j'ai jusqu'à présent:

<UserControl x:Class="View.ViewInvoiceUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" > 
<Grid Name="_grid" MinHeight="100"> 

Snipped pour plus de clarté ...

<TabControl 
    ItemsSource="{Binding Path=CurrentInvoice.InvoicePages}" 
    Grid.Column="0" 
    Grid.ColumnSpan="4" 
    Grid.Row="5" 
    HorizontalAlignment="Left" 
    Margin="0,4,0,0" 
    Name="_invoicePageTabControl" 
    VerticalAlignment="Top"> 
    <TabControl.ItemContainerStyle /> 
     <TabControl.ContentTemplate> 
      <DataTemplate> 
       <DataGrid 
        Name="_invoiceLineGrid" 
        AutoGenerateColumns="False" 
        CanUserSortColumns="True" 
        ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
        HorizontalAlignment="Left" 
        ItemsSource="{Binding InvoiceLines}" 
        IsReadOnly="True" 
        RowDetailsVisibilityMode="VisibleWhenSelected" 
        RowStyle="{StaticResource DataGridRowStyle}" 
        SelectionUnit="FullRow" 
        VerticalAlignment="Top" 
        Visibility="{Binding Path=InvoiceLineGridVisibility}" 
        Initialized="_invoiceLineGrid_Initialized"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Line Number" MinWidth="50" Binding="{Binding InvoiceLineNumber}" /> 
         <DataGridTextColumn Header="Description" MinWidth="50" Width="*" Binding="{Binding Description}" /> 
         <DataGridTextColumn Header="Quantity" MinWidth="50" Binding="{Binding Quantity}" /> 
         <DataGridTextColumn Header="Extended Cost" MinWidth="50" Width="*" Binding="{Binding ExtendedCost}" /> 
        </DataGrid.Columns> 
        <DataGrid.GroupStyle> 
         <GroupStyle> 
          <GroupStyle.ContainerStyle> 
           <Style TargetType="{x:Type GroupItem}"> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate TargetType="{x:Type GroupItem}"> 
               <Expander> 
                <Expander.Header> 
                 <StackPanel> 
                  <TextBlock Text="{Binding Name}" /> 
                 </StackPanel> 
                </Expander.Header> 
                <ItemsPresenter /> 
               </Expander> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </GroupStyle.ContainerStyle> 
         </GroupStyle> 
        </DataGrid.GroupStyle> 
       </DataGrid> 
      </DataTemplate> 
     </TabControl.ContentTemplate> 
    </TabControl> 
</Grid> 
</UserControl> 

Je pense que je dois ajouter quelque chose comme:

<CollectionViewSource> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="DepartmentBillingCode" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

Si j'ajoute le CollectionViewSource en tant que ressource et modifiez la liaison DataGrid, il n'y a aucune ligne dans la grille. Si j'ajoute le CollectionViewSource au DataGrid, je reçois une exception: Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead. niché dans Add value to collection of type 'System.Windows.Controls.ItemCollection' threw an exception. Mais je ne vois pas GroupDescription ou PropertyGroupDescription sur DataGrid.ItemSource

Alors, je me sens perdu maintenant. Toutes les suggestions sont appréciées.

Merci

+0

@ Георгий Ланец, merci pour l'édition. C'est agréable de voir de vieilles questions attirer un peu l'attention. –

+0

Paul, votre bienvenue. J'aime apporter du code à la perfection. C'est pourquoi j'ai toujours pris des délais. –

Répondre

1

J'ai donc trouvé une réponse possible. Je suis ouvert à l'interprétation des autres. Est-ce une bonne solution?

En appliquant un SO post regarding what part of MVVM pattern is resonsible for grouping of DataGrid, je suis allé à la recherche d'une solution pour générer un regroupement dans le ViewModel. J'ai trouvé un exemple simple sur WpfTutorial.com

Dans mon InvoicePageViewModel, j'ai créé une nouvelle propriété qui crée un ListViewCollection à partir de ma liste. ListViewCollection me permet d'ajouter mon propre GroupDescription comme suit:

public ListCollectionView GroupedInvoiceLines 
    { 
     get 
     { 
      ListCollectionView groupedLines = new ListCollectionView(InvoiceLines); // TODO should this be cached? 

      groupedLines.GroupDescriptions.Add(new PropertyGroupDescription("DepartmentBillingCode")); 

      return groupedLines; 
     } 
    } 

Ensuite, il est trivial de changer la liaison de données sur le DataGrid de InvoiceLines à GroupedInvoiceLines.

Commentaires? Des questions?

Questions connexes