2010-10-16 4 views
0

Je lie une collection observable à ma grille.Comment accéder à la ressource liée après avoir trié le gridview WPF

public ObservableCollection<LibraryTrack> Biblio 
    { get { return _Biblio; } } 

La vue grille contient uniquement les valeurs nécessaires à afficher pour l'utilisateur. Les informations secondaires comme filelocation et l'ID de fichier ne sont pas liées au gridview, cette information est dans ce cas inutile pour l'utilisateur.

d'abord un code:

<GridView x:Key="gridview"> 
     <GridViewColumn Width="200" 
             HeaderContainerStyle="{StaticResource hcs}" 
             DisplayMemberBinding="{Binding Title}"> 
      <GridViewColumnHeader Content="Titel" Tag="Title" Click="SortClick"/> 
     </GridViewColumn> 
     <GridViewColumn Width="200" 
             HeaderContainerStyle="{StaticResource hcs}" 
             DisplayMemberBinding="{Binding Artist}"> 
      <GridViewColumnHeader Content="Artiest" Tag="Artist" Click="SortClick"/> 
     </GridViewColumn> 
     <GridViewColumn Width="200" 
             HeaderContainerStyle="{StaticResource hcs}" 
             DisplayMemberBinding="{Binding Album}"> 
      <GridViewColumnHeader Content="Album" Tag="Album" Click="SortClick"/> 
     </GridViewColumn> 
     <GridViewColumn Width="50" 
             HeaderContainerStyle="{StaticResource hcs}" 
             DisplayMemberBinding="{Binding Genre}"> 
      <GridViewColumnHeader Content="Genre" Tag="Genre" Click="SortClick"/> 
     </GridViewColumn> 
     <GridViewColumn Width="50" 
             HeaderContainerStyle="{StaticResource hcs}" 
             DisplayMemberBinding="{Binding Jaar}"> 
      <GridViewColumnHeader Content="Jaar" Tag="Jaar" Click="SortClick"/> 
     </GridViewColumn> 
    </GridView> 

Le tri est activé via le code et fonctionne parfaitement. Dans le code derrière, je le gestionnaire d'événement suivant:

private void SortClick(object sender, RoutedEventArgs e) 
    { 
     GridViewColumnHeader column = sender as GridViewColumnHeader; 
     String field = column.Tag as String; 

     if (_CurSortCol != null) 
     { 
      AdornerLayer.GetAdornerLayer(_CurSortCol).Remove(_CurAdorner); 
      LibView.Items.SortDescriptions.Clear(); 
     } 
     ListSortDirection newDir = ListSortDirection.Ascending; 
     if (_CurSortCol == column && _CurAdorner.Direction == newDir) 
      newDir = ListSortDirection.Descending; 

     _CurSortCol = column; 
     _CurAdorner = new SortAdorner(_CurSortCol, newDir); 
     AdornerLayer.GetAdornerLayer(_CurSortCol).Add(_CurAdorner); 
     LibView.Items.SortDescriptions.Add(new SortDescription(field, newDir)); 
    } 

Libview est le ListView contenant le gridview. pour commencer à jouer la chanson sélectionnée J'utilise le code suivant:

private void BtnPlay_Click(object sender, RoutedEventArgs e) 
    { 
     if (LibView.SelectedIndex == -1) 
     { 
      LibView.SelectedIndex = 0; 
     } 
      LibraryTrack curtrack = Biblio[LibView.SelectedIndex]; 
      songInfoLabel1.Text = curtrack.Title + "\n" + 
            curtrack.Artist + "\n" + 
            curtrack.Album + "\n" + 
            curtrack.Jaar; 
      MediaEl.Source = new Uri(curtrack.Location); 
      MediaEl.Play();  
    } 

Voici mon problème. Tant que le gridview n'est pas trié Btn_Play_Click gère tout simplement bien.

Mais quand je trier les lignes, le Btn_Play_Click commence la mauvaise chanson. Comment puis-je résoudre ce problème?

Répondre

1

Au lieu d'utiliser Biblio[LibView.SelectedIndex] pour obtenir le LibraryTrack sélectionné, utilisez simplement LibView.SelectedItem à la place.

LibraryTrack curtrack = LibView.SelectedItem as LibraryTrack; 
+0

Oui, cela l'a résolu. question hors-sujet: le mot-clé "as" est le même que (LibraryTrack) LibView.SelectedItem –

+0

Pas vraiment. Fondamentalement, la différence est que l'utilisation de "as" ne lèvera pas une exception si "LibView.SelectedItem" ci-dessus n'est pas de type LibraryTrack (ou si selecteditem est null). Dans ce cas, curTrack sera juste égal à null. D'un autre côté, l'autre approche (c'est-à-dire le lancement) lèvera une exception si l'élément sélectionné n'est pas un LibraryTrack. – ASanch