LongListSelector SelectedItem 为 Null

Posted

技术标签:

【中文标题】LongListSelector SelectedItem 为 Null【英文标题】:LongListSelector SelectedItem is Null 【发布时间】:2014-08-17 06:33:29 【问题描述】:

我正在玩一个音乐播放器应用程序,并将播放列表存储在一个列表中。 这显示在 LongListSelector 中,其中包含带有图像和两个文本块的 StackPanel:

    <DataTemplate x:Key="playlistItemTemplate">
        <StackPanel Orientation="Horizontal">
            <Image Height="80" Width="80"  Margin="0,0,10,0" Source="/Assets/stop.png" Tap="removeSong_Tap" />
            <StackPanel VerticalAlignment="Center" Orientation="Horizontal" >
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="Binding Name" FontSize="22" VerticalAlignment="Center" HorizontalAlignment="Left" />
                    <TextBlock Text="Binding Artist" Style="StaticResource PhoneTextSubtleStyle" VerticalAlignment="Center" HorizontalAlignment="Left" />
                </StackPanel>
            </StackPanel>
        </StackPanel>
    </DataTemplate>

当用户单击图像时,我想从列表中删除选定的歌曲。 我正在使用以下代码:

    private void removeSong_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    
        int selectedIndex = playlistList.ItemsSource.IndexOf(playlistList.SelectedItem as ItemViewModel);

        if (selectedIndex == Data.currentSongNo)
        
            if (Data.currentSongNo == Data.playList.Count - 1) //last song in the playlist
            
                MediaPlayer.Stop();
            
            else
            
                playNextSong();
            

            removeSongFromPlaylist(selectedIndex);
        

    

但是每次我点击图片时,SelectedItem 都会显示为 null,这意味着 selectedIndex 设置为 -1

我也尝试过使用:

int selectedIndex = App.ViewModel.Items.IndexOf(playlistList.SelectedItem as ItemViewModel);

但这具有相同的结果。

任何想法我做错了什么?

【问题讨论】:

尝试使用playlistList.Items 而不是ItemsSource 谢谢,但代码似乎不喜欢那样。另外我遇到的问题是 playlistList.SelectedItem 为空 出于兴趣,我从这里得到了原始代码sn-p:***.com/questions/16514074/… 尝试使用 LongListSelector 的 SelectionChanged 事件! 我不认为这会有所帮助,因为我只想在用户点击歌曲标题旁边的 [X] 图像时运行点击事件 【参考方案1】:

我确信有几种方法可以做到这一点。我实现这一点的一种简单方法是使用在 SelectionChanged 事件开始时检查的标志。

点击事件将在树中的 selection_changed 事件之前触发,所以我设置了一个这样的点击事件:

    private void ItemClose_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    
        isItemCloseTapped = true;
    

然后,随着 Selection Changed 事件的触发,我实现如下:

private void MusicListSelectChange(object sender, SelectionChangedEventArgs e)

        Model.MusicItem item = ((LongListSelector)sender).SelectedItem as Model.MusicItem;

        if (item == null)
            return;

        if (isItemCloseTapped )
        
            CloseInList(item);

            isItemCloseTapped = false;
        
        //...

        //((LongListSelector)sender).SelectedItem = null;
)

同样,这是一种方法,但对我来说效果很好。

【讨论】:

【参考方案2】:

而不是尝试在您的 Tap 事件处理程序中查询 Selected[Index|Item] 查询 sender。 这将告诉您该人“选择”了哪个项目。

您遇到的根本问题是,当该人点击图像时,该项目实际上并未被选中。

【讨论】:

以上是关于LongListSelector SelectedItem 为 Null的主要内容,如果未能解决你的问题,请参考以下文章

用于 Xamarin.Forms 的带有标头 (LongListSelector) 的 ListView

LongListSelector和上下文菜单

LongListSelector SelectedItem 为 Null

如何在 windows phone 7 中禁用 LongListSelector 中的滚动视图

在 Windows Phone 8 的混合示例数据中使用 ListBox 而不是 LongListSelector

如何将数据从CustomMessageBox传递到调用它的页面?