2010-10-08 14 views
6

Używam CollectionViewSource do grupowania moich danych. W moich danych mam Property1 i Property2, które muszę grupować.WPF CollectionViewSource Grouping

Jedynym zastrzeżeniem jest to, że nie chcę podgrup z innej grupy. Tak więc, gdy pogrupuję według tych dwóch właściwości, nie chcę mieć tak, aby Property2, ponieważ podgrupa z grupy Property1.

Powód dlaczego chcę to dlatego muszę mieć nagłówek, który pokazuje następujące informacje:

Header:

<TextBlock.Text> 
    <MultiBinding StringFormat="Property1: {0}, Property2: {1}"> 
    <Binding Path="Property1"/> 
    <Binding Path="Property2"/> 
    </MultiBinding> 
</TextBlock.Text> 

próbowałam tego z moim CollectionViewSource ale nie był w stanie "połącz" grupę i podgrupę razem:

<CollectionViewSource x:Key="myKey" Source="{Binding myDataSource}"> 
    <CollectionViewSource.GroupDescriptions> 
    <PropertyGroupDescription PropertyName="Property1" /> 
    <PropertyGroupDescription PropertyName="Property2" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

Czy można pogrupować dwie właściwości razem? Coś jak poniżej?

<CollectionViewSource x:Key="myKey" Source="{Binding myDataSource}"> 
    <CollectionViewSource.GroupDescriptions> 
    <PropertyGroupDescription PropertyName="Property1,Property2" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

Odpowiedz

18

Zamiast tworzyć kolejny nowy obiekt w swoim obiekcie rzeczywiście można również kilka sztuczek na przetwornicy. Kropka (".") Przekazuje cały obiekt do konwertera. Możesz więc wykonać algorytm logiczny zamiast tworzyć nową właściwość w oryginalnym obiekcie.

<CollectionViewSource x:Key="myKey" Source="{Binding myDataSource}"> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="." 
        Converter="{StaticResource Property1AndProperty2}" /> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

Do konwertera coś takiego:

public class WidthAndHeightMixer : IValueConverter 
{ 
     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value is YourObject) 
      { 
        return (value as YourObject).Property1 + (value as Inventory).Property2 
      } 
     } 
     ...... 
+0

Nicei, to jest dokładnie to, co szukałem – Miles

+0

Jest to świetna wskazówka, uczciwie. – BladeWise

2

Można połączyć właściwości w jedną właściwość w obiekcie danych. Na przykład:

public class Person 
{ 
    public Person() 
    { 
     IsActive = true; 
    } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public Boolean IsActive { get; set; } 
    public string LastNameIsActive 
    { 
     get { return LastName + IsActive.ToString(); } 
    } 
} 
<Grid.Resources> 
    <CollectionViewSource x:Key="view" Source="{StaticResource persons}"> 
     <CollectionViewSource.SortDescriptions> 
      <cm:SortDescription PropertyName="LastName" Direction="Ascending"/> 
      <cm:SortDescription PropertyName="IsActive" Direction="Ascending"/> 
     </CollectionViewSource.SortDescriptions> 
     <CollectionViewSource.GroupDescriptions> 
      <PropertyGroupDescription PropertyName="LastNameIsActive"/> 
     </CollectionViewSource.GroupDescriptions> 
    </CollectionViewSource> 
</Grid.Resources> 
<ListView ItemsSource="{Binding Source={StaticResource view}}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}"/> 
      <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding LastName}"/> 
     </GridView> 
    </ListView.View> 
    <ListView.GroupStyle> 
     <GroupStyle > 
      <GroupStyle.HeaderTemplate> 
       <DataTemplate> 
        <TextBlock Background="Gray" DataContext="{Binding Items}"> 
         <TextBlock.Text> 
          <MultiBinding StringFormat="Is Active: {0} Last Name: {1}"> 
           <Binding Path="IsActive"/> 
           <Binding Path="LastName"/> 
          </MultiBinding> 
         </TextBlock.Text> 
        </TextBlock> 
       </DataTemplate> 
      </GroupStyle.HeaderTemplate> 
     </GroupStyle> 
    </ListView.GroupStyle> 
</ListView>