2010-05-07 2 views
3

Я относительно новичок в WPF, поэтому я разбираюсь в стилях и сеттерах, но у меня возникают проблемы с этим.Как показать группировку в сетке данных WPF с несколькими уровнями?

Я использую WPF Data Grid и вам нужно показать несколько уровней группировки. Я бы хотел, чтобы уровни 2-й и 3-й группы были более отступом, чем верхний уровень.

Следующий код отображает уровни группы, но он показывает их один прямо поверх другого и делает невозможным рассказать о том, что они представляют собой уровни вложенных групп.

<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GroupItem}"> 
        <Expander IsExpanded="True"> 
         <Expander.Header> 
          <TextBlock Text="{Binding Path=Name}"/> 
         </Expander.Header> 
         <ItemsPresenter /> 
        </Expander> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Как я могу получить заголовок группы для отступа в зависимости от уровня?

+0

Вы используете ICollectionView сделать группировку? – Stephan

+0

Да, я использую ICollectionView для выполнения группировки. – Keith

ответ

0

Я уже использую ICollectionView и PropertyGroupDescription, чтобы добавить группировку, однако вы все равно должны использовать XAML для описания того, как будет отображаться группировка, иначе вы не получите никакой индикации интерфейса для группировки.

Я заинтересован в том, как настроить XAML, так что я могу представить несколько уровней группировки, желательно с каким-то отступа на уровне группы или что-то подобное ....

1

Насколько я знаю (или в последний раз, когда я проверил) WPF Datagrid не поддерживает иерархическую группировку.

Ближайший я мог найти this.

Вот почему мы пошли с Xceed DataGrid в нашем приложении. К сожалению, это не бесплатно, чтобы вам было не подойдет.

1

У меня была та же проблема, и я нашел несовершенство пути. Если вы добавите поле слева от вашего ItemsPresenter, каждый уровень будет отступом, как и следовало ожидать. К сожалению, заголовки столбцов больше не совпадают с столбцами содержимого. Я все еще ищу исправление для этого ...

1

Этот урок идет в правильном направлении: Multi Grouping in DataGrid Но, к сожалению, «PagedCollectionView» - это Silverlight.

3

В случае, если кто-либо из будущего столкнется с этим. У меня были вложенные группы и стиль, чтобы они не были сложены друг на друга, выполняя следующие действия.

Добавить объект в CollectionViewSource:

<Window.Resources> 
    <CollectionViewSource x:Key="cvs" Source="{Binding TestData}"> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="TopProperty"/> 
      <PropertyGroupDescription PropertyName="SubProperty"/> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

Затем в DataGrid XAML вы должны указать 2 GroupStyles, а второй из них будет использоваться для вложенной группы. Я добавил поля в StackPanel второй группы, чтобы направить текст вправо, чтобы он выглядел так, как будто он находился в соответствующем столбце.

<DataGrid.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <StackPanel> 
             <Border Background="#FF959595" BorderBrush="#FF727272" BorderThickness="0,0,0,1" Margin="5,0,0,0">            
              <StackPanel Height="23" Orientation="Horizontal" Margin="3,0,0,0" Background="#FFE6E6E6"> 
               <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100" VerticalAlignment="Center"/> 
              </StackPanel> 
             </Border> 
              <ItemsPresenter /> 
            </StackPanel> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <Border Background="#FF959595" BorderBrush="#FF727272" BorderThickness="0,0,0,1" Margin="5,0,0,0"> 
           <StackPanel Height="23" Orientation="Horizontal" Margin="3,0,0,0" Background="#FFF3F3F3"> 
            <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="55,0,0,0" Width="100" VerticalAlignment="Center"/> 
           </StackPanel> 
          </Border> 
         </StackPanel> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
      </GroupStyle> 
</DataGrid.GroupStyle> 

Я был в состоянии найти больше об этом здесь: https://msdn.microsoft.com/en-us/library/ff407126%28v=vs.110%29.aspx

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