我有一个列表框,对于每个列表框项,我需要根据绑定的数据显示上下文菜单项。 这是我的列表框
<ListBox x:Name="pdflist" ItemsSource="{Binding}" Margin="18,0,7,0" SelectionChanged="pdflist_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu x:Name="mymenu" ItemsSource={Binding}>
<toolkit:ContextMenu.ItemTemplate>
<DataTemplate>
<toolkit:MenuItem Header="{Binding isFavorite}" Click="favorite_Click" />
</DataTemplate>
</toolkit:ContextMenu.ItemTemplate>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<Grid Width="420">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"></ColumnDefinition>
<ColumnDefinition Width="350"></ColumnDefinition>
<ColumnDefinition Width="60"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image VerticalAlignment="Top" Margin="0,20,0,0" Height="20" Width="25" Source="/Assets/PDF.png" Grid.Column="0" Stretch="None" >
</Image>
<TextBlock TextWrapping="Wrap" Grid.Column="1" Foreground="Black" FontSize="30" Text="{Binding name}"></TextBlock>
<Image Height="20" Width="25" Grid.Column="2" Source="{Binding isFavorite,Converter={StaticResource typeconvert}}"></Image>
</Grid>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
绑定到列表框的数据具有模型
public class resources
{
public string name
{
get;
set;
}
public bool isRead { get; set; }
public bool isFavorite { get; set; }
}
当我运行我的代码时,我无法在上下文菜单中查看任何菜单项。
我试过这个
<ItemsControl ItemsSource="{Binding isFavorite}" Tag="{Binding ElementName=pdflist, Path=DataContext}">
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}" Click="favorite_Click"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
</ItemsControl>
长按,上下文菜单本身不会出现!!
答案 0 :(得分:1)
ContextMenu
不属于您的UserControl VisualTree
的一部分,因此Binding无法解决问题。
请在this帖子上抓一个战利品。对于这个问题,这是一个很好而舒适的解决方法。
答案 1 :(得分:1)
您可能想要做的是:
<DataTemplate>
<StackPanel>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
<toolkit:MenuItem Header="add to favourites" Visibility="{Binding isFavorite, Converter={StaticResource BoolToVisibility}}" Tap="HandleFavouriteTap"/>
<toolkit:MenuItem Header="remove from favourites" Visibility="{Binding isFavorite, Converter={StaticResource BoolToCollapsed}}" Tap="HandleFavouriteTap"/>
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<Grid Width="420">
...
</Grid>
</StackPanel>
</DataTemplate>
您不应使用ItemsSource属性,因为您的View Model(资源类)上没有可用作可用命令列表的IEnumerable属性。您只需要一个命令,但根据isFavorite属性的值而不同 - 所以添加两个MenuItem并绑定它们的Visibility。在上面的解决方案中,您将需要两个定义为recourcesn的bool-to-visilibity转换器。
请注意,根据我的经验,最好完全避免使用ContextMenu的ItemsSource。因为那时你必须定义DataTemplate并将MenuItem放在模板中。因此,DataTemplate的MenuItem包含另一个MenuItem。当仅使用Tap事件时,您可能不会注意到任何奇怪的事情,但是当绑定到Command时,MenuItems将不会按预期运行。