2009-03-12 24 views
22

Tôi có một ListView mà tôi muốn nhóm các kết quả vào, tuy nhiên các ví dụ mà tôi đang tìm không hoạt động. Tôi có thể nhóm các kết quả của mình bằng cách nào?Làm cách nào để nhóm các mục trong Danh sách WPF

Tôi muốn nhóm trên thuộc tính Status của một đối tượng tùy chỉnh.

Đây là những gì tôi có:

<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> 

Và đây là đoạn code mà tôi có:

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); 
} 

Trả lời

23

tôi nhận thấy một điều ngay lập tức - sự GroupStyle.HeaderTemplate sẽ được áp dụng cho một CollectionViewGroup, nên bạn DataTemplate có lẽ trông giống như sau:

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

CollectionViewGroup.Name sẽ được chỉ định giá trị là Status cho nhóm đó.

+0

Vâng, tôi nhận được ba trường hợp của nhóm hiện nay bây giờ, nhưng nhóm của nó để thắng. Bạn trở thành anh hùng cá nhân của tôi ở đây. – Russ

+0

Tôi làm cách nào để sử dụng mã này trong môi trường MVVM? Không có dòng mã gần nơi các mục danh sách được đặt. Chúng được sử dụng thông qua ràng buộc. Tôi không thể tìm thấy một sự kiện mà tôi có thể móc phương thức AddGrouping() vào. Khi DataContext của toàn bộ điều khiển người dùng đã thay đổi, ItemsSource của danh sách vẫn là null. Tôi đoán phải mất lâu hơn một chút. – ygoe

+0

Bạn có thể tạo [CollectionViewSource] (http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx) trong XAML với nhóm thích hợp và liên kết các điều khiển của bạn với điều đó thay vì bộ sưu tập nguồn trực tiếp. –

3

Tôi nghĩ rằng đây cũng có thể được tốt hơn, sử dụng một groupstyle với một ControlTemplate mới:

<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> 
Các vấn đề liên quan