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

本文关键字:菜单 Windows Phone 上下文 绑定 | 更新日期: 2023-09-27 17:56:41

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

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

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

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

您可能

想要做的是:

<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 属性,因为视图模型(资源类)上没有可用作可用命令列表的 IEnumerable 属性。您只需要一个命令,但根据 isFavorite 属性的值而有所不同 - 因此添加两个菜单项并绑定它们的可见性。在上述解决方案中,您将需要两个定义为 recourcesn 的布尔-可见度转换器。

请注意,根据我的经验,最好完全避免上下文菜单的ItemsSource。因为这样你必须定义数据模板,并将菜单项放在模板中。因此,数据模板的菜单项与另一个菜单项一起包装。仅使用 Tap 事件时,您可能不会注意到任何奇怪之处,但是当绑定到 Command 时,菜单项的行为将不按预期显示。

ContextMenu不是

用户控件VisualTree的一部分,因此绑定不会开箱即用。

请在这篇文章中抢劫。这是解决此问题的一个很好且舒适的解决方法。