2009-03-12 24 views
22

Mam ListView, które chcę zgrupować wyniki, jednak przykłady, które znajduję nie działają. Jak pogrupować wyniki?Jak grupować elementy w widoku listy WPF

Chcę zgrupować w własności Status obiektu niestandardowego.

To jest to, co mam:

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

I to jest kod, który mam:

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

Odpowiedz

23

Zauważyłem jedną rzecz od razu - w GroupStyle.HeaderTemplate będą stosowane do CollectionViewGroup, więc DataTemplate powinien prawdopodobnie wyglądać tak:

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

CollectionViewGroup.Name zostanie przypisana dla tej grupy jako wartość Status.

+0

Cóż, ja dostaję trzy instancje grupy już teraz, ale jego zgrupowanie oznacza wygraną. Twój osobisty bohater staje się tutaj. – Russ

+0

Jak mogę użyć tego kodu w środowisku MVVM? Nie ma bliskiej linii kodu, w której ustawione są elementy listy. Są używane przez wiązanie. Nie mogę znaleźć zdarzenia, do którego można podłączyć metodę AddGrouping(). Gdy zmieni się Kontekst danych całej kontroli użytkownika, pozycja ItemsSource listy jest nadal pusta. Chyba trwa to trochę dłużej. – ygoe

+0

Można utworzyć [CollectionViewSource] (http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx) w XAML przy użyciu odpowiedniego grupowania i powiązać je z tym sterowaniem zamiast z kolekcja źródłowa bezpośrednio. –

3

myślę, może to być również lepiej, używając GroupStyle z nowym ControlTemplate:

<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> 
Powiązane problemy