views:

19

answers:

1

Hi

I am binding an observable collection to my gridview.

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

The gridview only contains the necessary values for the user to see. The secondary information like filelocation and file id isn't bound to the gridview, this info is in this case useless for the user to see.

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

Sorting is enabled via code and works perfectly. In the code behind, I have the following event handler:

    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 is the ListView containing the gridview. to start playing the selected song I use next code:

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

Here comes my problem. As long as the gridview isn't sorted Btn_Play_Click handles everything just fine.

But when I sort the rows the Btn_Play_Click starts the wrong song. How can I fix this?

+1  A: 

Instead of using Biblio[LibView.SelectedIndex] to get the selected LibraryTrack, just use LibView.SelectedItem instead.

LibraryTrack curtrack = LibView.SelectedItem as LibraryTrack;
karmicpuppet
Yep that solved it. offtopic question:the "as" keyword is that the same as (LibraryTrack)LibView.SelectedItem
Maarten Van Genechten
Not really. Basically, the difference is that using "as" will not throw an exception if "LibView.SelectedItem" above is not of type LibraryTrack (or if selecteditem is null). In that case, curTrack will just be equal to null. On the other hand, the other approach (i.e. casting) will throw an exception if selected item is not a LibraryTrack.
karmicpuppet