2011-10-06 13 views
5
<!-- GroupHeaderStyle --> 
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type GroupItem}"> 
       <Expander IsExpanded="False" Margin="15,0,0,0"> 
        <Expander.Header> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding ????????????}"/> 
          <TextBlock Text="-->"/> 
          <TextBlock Text="{Binding Name}"/> 
         </StackPanel> 
        </Expander.Header> 
        <ItemsPresenter /> 
       </Expander> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

En el código anterior deseo mostrar el nombre de la propiedad mediante el cual está agrupado. P. ej. Género -> Niño; Género -> Niña.¿Cómo puedo mostrar el nombre de la propiedad en el encabezado del grupo en wpf

public class Test 
{ 
    string gender; 
    public string Gender 
    { 
     get { return gender; } 
     set { gender = value; } 
    } 
} 

¿Qué debo proporcionar para ???????????? en el xaml anterior?

Además, avíseme si hay algún buen libro o enlace que explique los detalles internos de la agrupación en ListCollectionView.

Respuesta

1

El DataContext debe ser una instancia de CollectionViewGroup, que tendrá su propiedad Name establecida en el "grupo" (es decir, el valor de Género). Pero no existe una correlación entre CollectionViewGroup y de qué propiedad proviene. Técnicamente, la propiedad podría tener múltiples niveles de profundidad.

La única buena alternativa es ordenar en otra propiedad que tenga toda la información que necesita. La propiedad CollectionViewGroup.Name es un objeto, no una cadena. Por lo que podría hacer algo como:

public class GenderGroup { 

    public GenderGroup(string gender) { 
     this.Gender = gender; 
    } 

    public string Gender { get; private set; } 
    public string Title { 
     get { 
      return "Gender"; 
     } 
    } 

    public override bool Equals(object obj) { 
     var other = obj as GenderGroup; 
     return (other != null && string.Equals(this.Gender, other.Gender)); 
    } 
} 

public class Test { 
    string gender; 
    GenderGroup genderGroup = new GenderGroup("none"); 

    public string Gender { 
     get { return gender; } 
     set { 
      gender = value; 
      genderGroup = new GenderGroup(gender); 
     } 
    } 

    public GenderGroup GenderGroup { 
     get { return genderGroup; } 
    } 

} 

Y luego acceder a ella de esta manera:

<!-- GroupHeaderStyle --> 
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type GroupItem}"> 
       <Expander IsExpanded="False" Margin="15,0,0,0"> 
        <Expander.Header> 
         <StackPanel Orientation="Horizontal"> 
          <TextBlock Text="{Binding Name.Title}"/> 
          <TextBlock Text="-->"/> 
          <TextBlock Text="{Binding Name.Gender}"/> 
         </StackPanel> 
        </Expander.Header> 
        <ItemsPresenter /> 
       </Expander> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Esa es la idea básica, pero se podría hacer GenderGroup más genérico. Entonces en lugar de codificar "Gender" podría pasar que tiene un parámetro.

+0

Gracias CodeNaked por la respuesta ... ¿Eso significa que no puedo obtener el nombre de la propiedad que se muestra en el encabezado de ninguna manera directa ...? –

+0

@SudhakarSingh - Agregué el único trabajo que se me ocurre a mi respuesta. – CodeNaked

Cuestiones relacionadas