2010-10-16 3 views
0

Я привязываю наблюдаемую коллекцию к моему gridview.Как получить доступ к связанным ресурсам после сортировки gridview WPF

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

Отображение сетки содержит только необходимые значения для просмотра пользователем. Вторичная информация, такая как filelocation и id файла, не привязана к gridview, эта информация в этом случае бесполезна для пользователя.

Первый некоторый код:

<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> 

Сортировка включена с помощью кода и работает отлично. В коде позади, у меня есть следующий обработчик события:

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 является ListView, содержащий GridView. чтобы начать воспроизведение выбранной вами песни. Я использую следующий код:

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();  
    } 

Здесь возникает моя проблема. Пока gridview не сортируется Btn_Play_Click обрабатывает все как раз отлично.

Но когда я сортирую строки, Btn_Play_Click начинает неправильную песню. Как я могу это исправить?

ответ

1

Вместо того, чтобы использовать Biblio[LibView.SelectedIndex], чтобы получить выбранный LibraryTrack, используйте вместо этого LibView.SelectedItem.

LibraryTrack curtrack = LibView.SelectedItem as LibraryTrack; 
+0

Да, это решило проблему. оффтопический вопрос: ключевым словом «как» является то же, что и (LibraryTrack) LibView.SelectedItem –

+0

Не совсем. В принципе, разница заключается в том, что использование «как» не будет генерировать исключение, если «LibView.SelectedItem» выше не имеет типа LibraryTrack (или если selecteditem имеет значение NULL). В этом случае curTrack будет равен нулю. С другой стороны, другой подход (т. Е. Литье) генерирует исключение, если выбранный элемент не является библиотекой. – ASanch

Смежные вопросы