2010-10-15 9 views
0

Je rencontre des problèmes pour déterminer l'en-tête de la colonne listview. Dans le XAML, j'ai ceci:Problème de tri ListView par colonne

ListView Name="myListView" ItemsSource="{Binding MyItemList}" GridViewColumnHeader.Click="ListView_Click"

Et une fois qu'il ya un clic sur l'en-tête de colonne, je gère comme ceci:


private void ListView_Click(object sender, RoutedEventArgs e) 
     { 
      GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; 
      string header = headerClicked.Column.Header as string; 
[...] 

Voilà comment je l'ai vu le tri par colonne fait dans de nombreux échantillons. Après cela, j'utilise l'en-tête pour déterminer quelle colonne trier, et faire le tri.

Mon problème est que headerClicked.Column.Header est le nom affiché de l'en-tête de colonne, qui est différent pour les différentes langues. Existe-t-il un moyen d'obtenir un autre type d'identifiant qui ne dépend pas de l'affichage/du langage au lieu de s'appuyer sur la chaîne "header"?

Merci! Pourquoi ne pas utiliser IComparer et un custom sorter et ne pas tenir compte des en-têtes ensemble?

Répondre

0

vous pouvez utiliser DisplayMemberBinding:


Binding b = headerClicked.Column.DisplayMemberBinding as Binding; 
string header = b != null ? b.Path.Path as string : null; 

alternativement, vous pouvez déclarer une propriété attachée pour chacun il Ader avec le nom à utiliser et à utiliser.

konstantin

0

Cela supprimera votre lien avec l'interface utilisateur et ce que vous affichez, ce qui vous permettra de vous concentrer sur l'objet métier (modèle), sur lequel l'accent doit être mis. L'utilisation de l'interface utilisateur est si lourde qu'elle n'est jamais évolutive et créera un problème de maintenance à un moment donné, si ce n'est déjà fait.

0

Le plus simple serait d'utiliser la propriété Name (ou la propriété Tag) sur l'en-tête, modifier votre XAML comme ceci:

<ListView Height="100" HorizontalAlignment="Left" Margin="10,10,0,0" Name="listView1" VerticalAlignment="Top" Width="234"> 
    <ListView.View> 

     <GridView> 
      <GridViewColumn Width="100"> 
       <GridViewColumnHeader Name="Sort1" Content="Header1" Click="Header_Click"/> 
      </GridViewColumn> 
      <GridViewColumn Width="100"> 
       <GridViewColumnHeader Name="Sort2" Content="Header2" Click="Header_Click"/> 
      </GridViewColumn> 
     </GridView> 
    </ListView.View> 
</ListView> 

Ensuite, vous pouvez modifier votre gestionnaire comme ceci:

private void Header_Click(object sender, RoutedEventArgs e) { 
     GridViewColumnHeader header = sender as GridViewColumnHeader; 
     String sort = header.Name; 
     // Sort code here... 
     return; 
    }