【问题标题】:Binding a header to context menu- windows phone将标题绑定到上下文菜单-windows phone
【发布时间】:2014-04-12 05:34:04
【问题描述】:

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

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

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

【问题讨论】:

  • 您的ListBox 中每个项目的类型是什么?是resourcesListBox.ItemsSourceresources 的某种列表吗?
  • 它是一个列表 List retrievedpdf = "some query"。 pdflist.ItemsSource = 检索的pdf;
  • ItemsSource 中的属性ContextMenu 写入不正确。
  • @Roman 我已经编辑过了,还是没有运气..
  • 因为 ItemsSource 期望 IEnumerableresources 只是一个项目,而不是一个列表

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


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

请注意,根据我的经验,最好完全避免使用 ContextMenu 的 ItemsSource。因为那时您必须定义 DataTemplate 并将 MenuItem 放在模板中。结果,DataTemplate 的 MenuItem 被另一个 MenuItem 包装。仅使用 Tap 事件时您可能不会注意到任何奇怪的事情,但是当绑定到 Command 时,MenuItems 将不会按预期运行。

【讨论】:

  • 谢谢你的回答,如果我不为上下文菜单分配 itemsSource,itemsSource 会从它的父说列表框中获取吗?
  • @PrasannaAarthi 否。设置 ItemsSource 意味着您希望使用您绑定到的 collection 的内容自动填充 ItemsPanel。您的 ViewModel 上没有此类集合。但是,ContextMenu 的 DataContext 是继承的,因此如果您的 Item ViewModel(您的 resources 类)具有 Commands,您可以在 MenuItems 中绑定到这些 Commands。
  • 我试过你的代码,这是我的转换器 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfoculture) { if (value == "true") { return Visibility 。可见的; } else { 返回 Visibility.Collapsed;但是然后菜单是空白的,尽管转换器返回了可见的..任何线索?
  • 谢谢,必须对我的转换器进行一些修改。它有效!!
【解决方案2】:

ContextMenu 不是您的 UserControl 的 VisualTree 的一部分,因此绑定无法开箱即用。

请在this 发帖抽奖。这是解决此问题的一个很好且舒适的解决方法。

【讨论】:

  • 我已经使用您的解决方案在我的代码中进行了编辑,现在甚至没有出现上下文菜单..
猜你喜欢
  • 2013-05-11
  • 2016-09-17
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多