2010-10-16 142 views
0

我綁定一個可觀察的集合到我的gridview。如何在排序gridview後訪問綁定的資源WPF

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

gridview只包含用戶看到的必要值。像文件位置和文件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是包含GridView中ListView。開始播放選定的歌曲我使用下一個代碼:

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

改爲使用LibView.SelectedItem代替使用Biblio[LibView.SelectedIndex]來獲取所選LibraryTrack

LibraryTrack curtrack = LibView.SelectedItem as LibraryTrack; 
+0

是的,解決了它。 offtopic問題: 「as」關鍵字與 (LibraryTrack)LibView.SelectedItem – 2010-10-16 16:10:09

+0

不一樣。基本上,區別在於如果上面的「LibView.SelectedItem」不是類型LibraryTrack(或者如果selecteditem爲null),那麼使用「as」不會引發異常。在這種情況下,curTrack將等於null。另一方面,如果選擇的項目不是LibraryTrack,則另一種方法(即投射)將引發異常。 – ASanch 2010-10-16 16:16:14