2010-10-08 25 views
6

Estoy usando un CollectionViewSource para agrupar mis datos. En mis datos, tengo Property1 y Property2 que necesito agrupar.WPF CollectionViewSource Agrupación

La única estipulación es que no quiero subgrupos de otro grupo. Entonces, cuando agrupe por estas dos propiedades, no quiero tenerlo para que Property2 porque un subgrupo del grupo Property1.

La razón por la que quiero que esto se debe a que necesita tener un encabezado que muestra la siguiente información:

Cabecera:

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

He intentado esto con mi CollectionViewSource pero no era capaz de "combinar" el grupo y el subgrupo juntos:

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

¿Es posible agrupar dos propiedades juntas? Algo como abajo?

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

Respuesta

18

En lugar de crear otra nueva característica en el objeto en realidad también puede tener algunos trucos en el convertidor. Dot ('.') Pasa el objeto completo a tu convertidor. Entonces puede hacer cualquier algoritmo lógico allí en lugar de crear una nueva propiedad en su objeto original.

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

En su convertidor algo como esto:

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

agradable, eso es exactamente lo que estaba buscando – Miles

+0

Este es un gran consejo, la verdad. – BladeWise

2

Puede combinar las propiedades en una sola propiedad en su objeto de datos. Por ejemplo:

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>