2011-04-10 2 views
1

Je crée un en-tête listview personnalisé avec le texte d'en-tête, mais également une zone de texte que vous pouvez entrer pour filtrer le contenu de cette colonne. Mon code ressemble actuellement à ceci:Liaison de la zone de texte dans l'en-tête de ListView datatemplate à une propriété de filtre

<UserControl.Resources> 
     <DataTemplate x:Key="myHeaderTemplate"> 
      <StackPanel> 
       <TextBlock FontSize="14" Foreground="DarkBlue" Margin="20,4" Text="{Binding}" /> 
       <TextBox Text="" Margin="4,2" /> 
      </StackPanel> 
     </DataTemplate> 
</UserControl.Resources> 

qui est la définition du DataTemplate d'en-tête contenant le TexBox; et le listview

<ListView ItemsSource="{Binding Path=MyData}" IsSynchronizedWithCurrentItem="True"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Last Name" HeaderTemplate="{StaticResource myHeaderTemplate}" 
          DisplayMemberBinding="{Binding Path=Something}" /> 
      <GridViewColumn Header="First Name" HeaderTemplate="{StaticResource myHeaderTemplate}" 
          DisplayMemberBinding="{Binding Path=Something}" /> 
      <GridViewColumn Header="Address" HeaderTemplate="{StaticResource myHeaderTemplate}" 
          DisplayMemberBinding="{Binding Path=Tube}" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

Je veux être en mesure de construire une instruction de filtrage que je peux appliquer aux lignes de ListView, mais pour ce faire, je dois obtenir les données de chaque zone de texte du filtre dans le modèle d'en-tête. Puis-je en quelque sorte lier les zones de texte dans les en-têtes aux propriétés de mon viewmodel? Sinon, y a-t-il un autre moyen d'obtenir le texte?

Merci pour toute aide.

Répondre

2

Vous devriez être en mesure de lier l'en-tête d'une propriété comme celui-ci:

<GridViewColumn 
    Header="{Binding LastNameFilter, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" 
    HeaderTemplate="{StaticResource myHeaderTemplate}" 
    DisplayMemberBinding="{Binding Path=Something}" /> 

Le RelativeSource est nécessaire pour arriver à la DataContext du ListView - vous pouvez aussi lui donner un nom et utiliser ElementName à la place.

Maintenant, vous pouvez faire une HeaderFilter classe:

public class HeaderFilter 
{ 
    public string Name { get; set; } 
    public string Filter { get; set; } 
} 

vous aurait évidemment besoin d'étendre cette classe pour accrocher dans le cas où Filter est changé pour effectuer le filtrage.

Mettre une propriété pour chaque en-tête de colonne de l'objet qui est le DataContext pour votre ListView (même objet qui fournit des MyData probablement)

public class SomeClass 
{ 
    .... 
    public HeaderFilter LastNameFilter { get; set; } 
    .... 
} 
+0

+1 était sur le point de poster quelque chose de similaire –

+0

Brillant répondre ChrisWue, c'est juste le billet. Merci beaucoup pour la bonne explication! – TripleAntigen

+0

ChrisWue J'essaie ce que vous suggérez et je vais avoir du mal à comprendre la déclaration de liaison que vous avez utilisé ci-dessus, en particulier tête = "{Binding LastNameFilter, RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type ListView}}}" – TripleAntigen

Questions connexes