将标题绑定到上下文菜单 - Windows Phone

时间:2014-04-05 10:32:14

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

我有一个列表框,对于每个列表框项,我需要根据绑定的数据显示上下文菜单项。 这是我的列表框

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

长按,上下文菜单本身不会出现!!

2 个答案:

答案 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将不会按预期运行。