2009-03-12 8 views
22

결과를 그룹화하려는 ListView이 있지만 찾으려는 예제는 작동하지 않습니다. 결과를 어떻게 그룹화 할 수 있습니까?WPF ListView에서 항목을 그룹화하는 방법

사용자 지정 개체의 Status 속성으로 그룹화하려고합니다.

내가 무엇을 가지고 :

<ListView IsSynchronizedWithCurrentItem="True" 
      ItemsSource="{Binding}" 
      HorizontalContentAlignment="Stretch" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      Background="Transparent" SelectionChanged="ListView_SelectionChanged" 
      Name="lstShelvedOrders"> 

     <ListView.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <TextBlock FontWeight="Bold" FontSize="15" 
         Text="{Binding Path=Status}"/> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
      </GroupStyle> 
     </ListView.GroupStyle> 

     <ListView.ItemContainerStyle> 
      <Style TargetType="{x:Type ListViewItem}"> 
       <Setter Property="BorderThickness" Value="1" /> 
       <Setter Property="Width" Value="Auto" /> 
       <Setter Property="FontSize" Value="10.4" />    
      </Style> 
     </ListView.ItemContainerStyle> 

     <ListView.View> 
      <GridView> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=Number}" Header="Shelve ID" /> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=Customer}" Header="Customer" /> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=PurchaseOrderNo}" Header="PO Number" /> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=SubmittedBy}" Header="Shelved By" /> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=OrderDate, StringFormat=MMM dd\, yyyy}" Header="Date" /> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=CustomerTerms.Description}" Header="Order Terms" /> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=ShippingMethod.Description}" Header="Shipping" /> 
       <GridViewColumn DisplayMemberBinding="{Binding Path=TotalPrice, StringFormat=c}" Header="Order Total" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 

그리고 이것은 내가 가지고있는 코드입니다 : 지금 당장 한 가지를 발견

void ShelvedOrderList_DataContextChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e) 
{ 
    AddGrouping(); 
} 

private void AddGrouping() 
{ 
    if (lstShelvedOrders.ItemsSource == null) 
    { 
     return; 
    } 

    CollectionView myView = (CollectionView)CollectionViewSource.GetDefaultView(lstShelvedOrders.ItemsSource); 
    PropertyGroupDescription groupDescription = new PropertyGroupDescription("Status"); 
    myView.GroupDescriptions.Add(groupDescription); 
} 

답변

23

을 - GroupStyle.HeaderTemplate 그렇게를 A CollectionViewGroup,에 적용됩니다 DataTemplate은 다음과 같아야합니다.

<GroupStyle> 
    <GroupStyle.HeaderTemplate> 
     <DataTemplate> 
      <TextBlock FontSize="15" FontWeight="Bold" Text="{Binding Name}"/> 
     </DataTemplate> 
    </GroupStyle.HeaderTemplate> 
</GroupStyle> 

CollectionViewGroup.Name에는 해당 그룹에 대해 Status 값이 지정됩니다.

+0

글쎄, 지금 현재 그룹의 세 개의 인스턴스를 얻고, 그러나 그것의 분류는이기는 것이다. 여기 내 개인 영웅이되고 있습니다. – Russ

+0

이 코드는 MVVM 환경에서 어떻게 사용할 수 있습니까? 목록 항목이 설정된 코드 줄이 없습니다. 그들은 바인딩을 통해 사용됩니다. AddGrouping() 메서드를 연결할 수있는 이벤트를 찾을 수 없습니다. 전체 사용자 정의 컨트롤의 DataContext가 변경되면 목록의 ItemsSource는 여전히 null입니다. 나는 그것이 조금 더 오래 걸린다 고 생각한다. – ygoe

+0

적절한 그룹화를 사용하여 [CollectionViewSource] (http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx)를 XAML에 만들고 대신 컨트롤을 바인딩 할 수 있습니다. 소스 컬렉션을 직접. –

3

나는이 또한 새로운 ControlTemplate이 함께하는 GroupStyle을 사용하여 더 나은 될 수 있다고 생각 :

<ListView ItemsSource="{Binding Path=ContactsView}"> 
    <ListView.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.ContainerStyle> 
     <Style TargetType="{x:Type GroupItem}"> 
      <Setter Property="Template" Value="{StaticResource ContactsGroupItemTemplate}" /> 
     </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
    </ListView.GroupStyle> 
...

<ControlTemplate TargetType="{x:Type GroupItem}" x:Key="ContactsGroupItemTemplate"> 
    <Expander IsExpanded="False"> 
    <Expander.Header> 
     <DockPanel> 
     <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100"/> 
      <TextBlock FontWeight="Bold" Text="{Binding Path=ItemCount}"/> 
      <TextBlock FontWeight="Bold" Text=" Items"/> 
     </DockPanel> 
    </Expander.Header> 
    <Expander.Content> 
     <ItemsPresenter /> 
    </Expander.Content> 
    </Expander> 
</ControlTemplate> 
관련 문제