2016-01-22 2 views
2

В моем приложении WPF у меня есть ListView документов с группировкой разделов:ListView условная группировка

myitems.Add(new Data("document_1", "section_1")); 
myitems.Add(new Data("document_1", "section_2")); 
myitems.Add(new Data("document_2", "one_and_only_section")); 
lv.ItemsSource = myitems; 
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lv.ItemsSource); 
view.GroupDescriptions.Clear(); 
view.GroupDescriptions.Add(new PropertyGroupDescription("document"); 

Это приводит к чему-то, что примерно выглядит

< document_1 
    section_1 
    section_2 
< document_2 
    one_and_only_section 

Это в теории хорошо, но очень утомительно выбрать элемент «one_and_only_section», если все свернуто, потому что ему нужны два клика (сначала на «document_2», второй на «one_and_only_section»). В идеале, document_2 не должны быть сгруппированы таким же образом, как document_1:

< document_1 
    section_1 
    section_2 
document_2 

Так что, если есть только один элемент в группе, он не должен иметь расширитель и показывают, что один элемент. Если выбрано, он должен действовать так, как будто выбрано «one_and_only_section».

Возможно ли это с ListView?

ответ

1

Я был в состоянии произвести желаемый результат с помощью следующего кода XAML:

<ListView ItemsSource="{Binding Path=ItemsView}"> 

     <ListView.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <ControlTemplate.Resources> 
             <DataTemplate DataType="{x:Type local:ItemViewModel}"> 
              <TextBlock Text="{Binding Path=Section}" /> 
             </DataTemplate> 
            </ControlTemplate.Resources> 
            <Expander Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}"> 
             <Expander.Header> 
              <StackPanel Margin="0,8,0,0" 
                 HorizontalAlignment="Stretch" 
                 Orientation="Horizontal"> 
               <TextBlock x:Name="Title" 
                  VerticalAlignment="Center" 
                  FontWeight="Bold"> 
                <Run Text="{Binding Path=Name, Mode=OneWay}" /> 
                <Run Text=" " /> 
                <Run Text="{Binding Path=Items.Count, Mode=OneWay}" /> 
               </TextBlock> 
              </StackPanel> 
             </Expander.Header> 
             <ItemsPresenter /> 
            </Expander> 

           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
         <Style.Triggers> 
          <DataTrigger Binding="{Binding Path=Items.Count}" Value="1"> 
           <Setter Property="Template"> 
            <Setter.Value> 
             <ControlTemplate TargetType="{x:Type GroupItem}"> 
              <ControlTemplate.Resources> 
               <DataTemplate DataType="{x:Type local:ItemViewModel}"> 
                <TextBlock Text="{Binding Path=Document}" /> 
               </DataTemplate> 
              </ControlTemplate.Resources> 
              <ItemsPresenter /> 
             </ControlTemplate> 
            </Setter.Value> 
           </Setter> 
          </DataTrigger> 
         </Style.Triggers> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </ListView.GroupStyle> 
    </ListView> 

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

+0

Работает как очарование, замечательно :-) Спасибо! –

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