我正在玩一个音乐播放器应用程序,并将播放列表存储在列表中。 它显示在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);
但这有相同的结果。
任何想法我做错了什么?
答案 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;。
您遇到的根本问题是,当用户点击图片时,该项目实际上并未被选中。