LongListSelector SelectedItem为Null

时间:2014-06-26 12:00:07

标签: c# xaml windows-phone-7 windows-phone-8 windows-phone

我正在玩一个音乐播放器应用程序,并将播放列表存储在列表中。 它显示在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);

但这有相同的结果。

任何想法我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

tap事件将在树中的selection_changed事件之前触发,因此我设置了一个Tap事件,如下所示:

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

同样,这是一种方法,但它在我的结束时运作良好。

答案 1 :(得分:0)

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

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