Получить родительскую ObservableCollection, выбранную Item — WP8

Я пишу приложение для воспроизведения потоковой музыки. В приложении у меня много списков (рейтинговый список, список результатов поиска, список выделенных песен.....), каждый список имеет один и тот же шаблон данных, который я привязываю к LongListSelector для каждой страницы. . Поэтому я использую этот шаблон данных в качестве ресурсов и помещаю его в app.xaml.

<DataTemplate x:Key="BasicVideoTemplate">
    <Grid Tap="ChangeSong_Tap" RowsAuto="50,50" ColumnsAuto="150,*" Background="White" Margin="5,0,5,10">
        <Grid.ColumnDefinition> 
            <ColumnDefinition Width = "150"/>
            <ColumnDefinition Width = "*"/>
        </Grid.ColumnDefinition>
        <Grid.RowDefinition> 
             <RowDefinition Height = "50"/>
             <RowDefinition Height = "50"/>
        </Grid.RowDefinition>
        <Border BorderThickness="1" BorderBrush="Black" Grid.RowSpan="2" Grid.Column="0" VerticalAlignment="Center" Margin="5,0,5,0">
            <Image Source="{Binding Cover}"/>
        </Border>
        <TextBlock Text="{Binding Name}" Grid.Row="0" Grid.Column="1" Style="{StaticResource BlackTextBlock}" Margin="5,0,0,0"/>
        <TextBlock Text="{Binding Artist}" Grid.Row="1" Grid.Column="1" Foreground="Black" Margin="5,0,0,0"/>
        <!-- .............. -->
    </Grid>
</DataTemplate>

И этот код (который я поместил в app.xaml.cs) для выбора песни из списка, создания AudioTrack из этого элемента и перехода к playSongPage:

private void ChangeSong_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
    var item = (SongItemModel)(sender as FrameworkElement).DataContext;
    App.Model.ChangeSong(item.Id);   /// this code will create a audio track for this item
    (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Pages/DetailSongPage.xaml", UriKind.Relative));
}

Проблема в том, что мне нужно создать List‹ AudioTrack> для моего списка воспроизведения. Итак, как я могу получить родительский список выбранного элемента и добавить его в List‹ AudioTrack> , в то время как весь этот код был помещен в app.xaml.cs ???


person user3448806    schedule 22.09.2014    source источник


Ответы (1)


Вместо этого я бы обработал это в событии SelectionChanged каждого longlistselector. Вся эта штука с Tap в сетке меня не устраивает.

<phone:LongListSelector x:Name="myLSS" SelectionChanged="myLSS_SelectionChanged"/>

// event handler changes to
private void myLSS_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    LongListSelector lls = sender as LongListSelector;  // get lls
    var item = (SongItemModel) lls.SelectedItem;
    App.Model.ChangeSong(item.Id);   /// this code will create a audio track for this item


    // now your ObservableCollection is just the ItemsSource, save a reference to it
    // in the State manager so you can reference it on another page if you wish
    ObservableCollection<SongItemModel> obs = (ObservableCollection<SongItemModel>) lls.ItemsSource;
    PhoneApplicationService.Current.State["current_obs"] = obs;

    // navigate..............
    (Application.Current.RootVisual as PhoneApplicationFrame).Navigate(new Uri("/Pages/DetailSongPage.xaml", UriKind.Relative));                 
}
person Chubosaurus Software    schedule 22.09.2014
comment
Итак, selectionChanged получит весь список как элементы? большое спасибо :D - person user3448806; 22.09.2014
comment
Да, longlistselector вызывает событие. так что вы можете просто получить его от отправителя. - person Chubosaurus Software; 22.09.2014
comment
слишком долго искал что-то настолько простое - thnx - person XikiryoX; 24.11.2014