WPF как получить данные из отфильтрованного списка вида сетки с наблюдаемым источником сбора - PullRequest
0 голосов
/ 16 января 2019

Я работаю над интерфейсом, который читает XML.

У меня есть список для альбомов:

<ListView x:Name="albums" HorizontalAlignment="Left" Height="146" Margin="26,99,0,0" VerticalAlignment="Top" Width="686" SelectionChanged="albums_SelectionChanged" Background="{x:Null}" UseLayoutRounding="False" >

                <ListView.View >
                    <GridView AllowsColumnReorder="False">
                        <GridView.ColumnHeaderContextMenu>
                            <ContextMenu/>
                        </GridView.ColumnHeaderContextMenu>
                        <GridViewColumn Header="Album" Width="260">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock TextWrapping="Wrap" Text="{Binding Titulo}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Artista" Width="260">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock TextWrapping="Wrap" Text="{Binding Artist}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="Año"
                                DisplayMemberBinding="{Binding Year}" Width="46"/>
                        <GridViewColumn Header="Genero" Width="90">
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <TextBlock TextWrapping="Wrap" Text="{Binding Genero}"/>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>

Я применяю некоторую фильтрацию, когда набираю текстовое поле с помощью этого кода:

  CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(albums.ItemsSource);
  view.Filter = UserFilter;
  albums.ItemsSource = CollectionViewSource.GetDefaultView(Albums);

private bool UserFilter(object item)
    {
        if (String.IsNullOrEmpty(subGenres.Text))
            return true;
        else
            return ((item as Albumclass.Albumlist2).Genero.IndexOf(subGenres.Text, StringComparison.OrdinalIgnoreCase) >= 0);
    }

private void SubGenres_TextChanged(object sender, TextChangedEventArgs e)
    {

        CollectionViewSource.GetDefaultView(albums.ItemsSource).Refresh();
      //  System.Diagnostics.Debug.WriteLine("escribir");
    }

Данные вида сетки взяты из наблюдаемой коллекции, называемой альбомами, поэтому без фильтрации я взял индекс из сетки, и этот индекс указывает на индекс наблюдаемой коллекции, из которой я беру идентификатор альбома, чтобы получить список песен следующим образом:

private void albums_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
            int index = albums.SelectedIndex;

             if (index >= 0)
             {
                 id = Albums.ElementAt(index).Id;
               //  string totalsongs = Albums.ElementAt(index).Totalelements;

                 //retrieve songslist
                 string tagurl = "http://" + serverurl + "/server/xml.server.php?action=album_songs&auth=" + token + "&filter=" + id;
                 string[] tagarray = { tagurl, "song", "track", "title", "composer", "artist", "time", "tag", "comment", "url" };

                 Songs.ItemsSource = null;
                 songs = new ObservableCollection<Albumclass.Albumlist2>();
                 songs = xmlobserv.Xmlparser(tagarray);

                 Songs.ItemsSource = songs;


             }
    }

но теперь, когда я применяю фильтр, список меняется, и я не знаю, как указать на фактический "индекс" наблюдаемой коллекции, чтобы я мог получить правильный список песен

Заранее благодарю за помощь

Ответы [ 3 ]

0 голосов
/ 16 января 2019

Проверьте аргумент SelectionChangedEventArgs, он содержит информацию, которую вы.

private void albums_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    //if the listview doesn't allow multi-selection, 
    //then this list contains only one item   
    foreach (object o in e.AddedItems) 
    {            
        Album al = o as Album;
        id = al.Id;
        //...
    }
}
0 голосов
/ 16 января 2019

Как предположил Дж. Х, решение было SelectedItem вместо Selectedindex,

Полученный код:

 private void albums_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
            int index = albums.SelectedIndex;


        if (index >= 0)
             {
            int indexid = albums.SelectedIndex;
            var selectedObject = albums.SelectedItems[0] as Albumclass.Albumlist2;
            if (selectedObject == null)
            {
                return;
            }

            id = selectedObject.Id;

            //obteniendo lista de albums
            string tagurl = "http://" + serverurl + "/server/xml.server.php?action=album_songs&auth=" + token + "&filter=" + id;
            string[] tagarray = { tagurl, "song", "track", "title", "composer", "artist", "time", "tag", "comment", "url" };//Creando array con datos a utilizar

            //Lennado ListView Songs
            Songs.ItemsSource = null;
            songs = new ObservableCollection<Albumclass.Albumlist2>();
            songs = xmlobserv.Xmlparser(tagarray);

            Songs.ItemsSource = songs;
             }

    }

Я использую selectedIndex, чтобы избежать ошибок при сбросе вида сетки

Большое спасибо

0 голосов
/ 16 января 2019

Вы пробовали что-то вроде:

ObservableCollection<Albumclass.Albumlist2> _collection = new ObservableCollection<Albumclass.Albumlist2>();

_collection.IndexOf(_item)

Вот документ http://msdn.microsoft.com/en-us/library/ms132410.aspx

...