如何使上下文菜单适用于Windows Phone? [英] How to make context menu work for windows phone?
问题描述
我正在使用Windows Phone Control工具箱中的ContextMenu。想知道如何知道按下列表中的哪个列表项?看来我可以知道选择了哪个上下文菜单,但无法知道要对哪个列表项进行操作。请帮忙。谢谢!
I am using ContextMenu from Windows Phone Control toolkit. Wondering how do I know which list item in the list is pressed? It seems I can know which context menu is selected but I have no way to know which list item is operated on. Please help. Thanks!
<DataTemplate x:Key="ListItemTemplate">
<StackPanel Grid.Column="1" VerticalAlignment="Top">
<TextBlock Tag="{Binding Index}" Text="{Binding SName}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="Add to playlist" Click="Move_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</StackPanel>
private void Move_Click(object sender, RoutedEventArgs e)
{
String name = (string)((MenuItem)sender).Header;
// how to know which index of the item is targeted on
}
推荐答案
我也推荐MVVM,但是可以简化它。无需为每个对象都拥有ViewModel。关键是将命令绑定到ItemsControl的DataContext(例如ListBox)。
I would also recommend MVVM, but it can be simplified. No need to go to the extreme of having a ViewModel for every object. The key is to bind the command to the DataContext of your ItemsControl (eg ListBox).
假设您的ItemTemplate用于ListBox,ListBox将其ItemsSource属性绑定到ViewModel。您的xaml如下所示:
Let's assume that your ItemTemplate is for a ListBox, the ListBox has it's ItemsSource property bound to your ViewModel. Your xaml would look like this:
<ListBox x:Name="SongsListBox" ItemsSource="{Binding Songs}">
<ListBox.ItemTemplate>
<DataTemplate >
<StackPanel >
<TextBlock Text="{Binding SName}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="Add to playlist" Command="{Binding DataContext.AddToPlaylistCommand, ElementName=SongsListBox}" CommandParameter="{Binding}"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
您的ViewModel,然后将具有属性歌曲
,这是您的模型对象的集合。它还具有一个ICommand AddToPlaylistCommand
。正如我之前所述, ICommand最喜欢的实现是PNP团队的DelegateCommand。
Your ViewModel, would then have the property Songs
, that is a collection of your model object. It also has an ICommand AddToPlaylistCommand
. As I've said before, my favorite implementation of ICommand is the DelegateCommand from the PNP team.
public class ViewModel : INotifyPropertyChanged
{
public ViewModel()
{
Songs = new ObservableCollection<Songs>();
AddToPlaylistCommand = new DelegateCommand<Song>(AddToPlaylist);
}
public ICollection<Songs> Songs { get; set; }
public ICommand AddToPlaylistCommand { get; private set; }
private void AddToPlaylist(Song song)
{
// I have full access to my model!
// add the item to the playlist
}
// Other stuff for INotifyPropertyChanged
}
这篇关于如何使上下文菜单适用于Windows Phone?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!