2010-10-08 4 views
6

J'utilise un CollectionViewSource pour regrouper mes données. Dans mes données, j'ai Property1 et Property2 que je dois regrouper.WPF CollectionViewSource Grouping

La seule condition est que je ne veux pas de sous-groupes d'un autre groupe. Donc, quand je grouper par ces deux propriétés, je ne veux pas l'avoir de sorte que Property2 parce qu'un sous-groupe du groupe Property1.

La raison pour laquelle je veux que c'est parce que je dois avoir une tête qui affiche les informations suivantes:

tête:

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

J'ai essayé avec mon CollectionViewSource mais n'a pas été en mesure de "combiner" ensemble le groupe et le sous-groupe:

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

Est-il possible de regrouper deux propriétés ensemble? Quelque chose comme ci-dessous?

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

Répondre

18

Au lieu de créer une autre nouvelle propriété dans votre objet, vous pouvez aussi avoir fait quelques tours sur le convertisseur. Dot ('.') Est de passer l'objet entier dans votre convertisseur. Vous pouvez donc faire n'importe quel algorithme de logique là-bas au lieu de créer une nouvelle propriété dans votre objet d'origine.

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

A votre convertisseur quelque chose comme ceci:

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

belle, c'est exactement ce que je cherchais – Miles

+0

C'est un bon conseil, honnêtement. – BladeWise

2

Vous pouvez combiner les propriétés en une seule propriété sur votre objet de données. Par exemple:

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>