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?
Oui, cela l'a résolu. question hors-sujet: le mot-clé "as" est le même que (LibraryTrack) LibView.SelectedItem –
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