【问题标题】:How to hide the menu item of context menu in wpf xaml based on condition如何根据条件隐藏wpf xaml中上下文菜单的菜单项
【发布时间】:2015-07-09 05:27:04
【问题描述】:

在我的 xaml 中,我使用 wpf ContextMenu 来显示 wpf datagid 中的菜单项。我需要根据条件隐藏菜单项。我尝试了以下方法,但它不起作用。

<ContextMenu x:Key="contextMenuTextCell">


            <MenuItem Name="copyDealContextMenu"
                    Header="Copy Deal"
                    Command="{Binding RelativeSource={RelativeSource AncestorType=DataGrid}, Path=DataContext.CopyDeal}"
                    CommandParameter="{Binding}">

                <Style TargetType="{x:Type MenuItem}">
                    <Setter Property="Visibility" Value="Collapsed"></Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="{ Binding ElementName= BlotGrid,Path=DataContext.ProductType }" Value="FXO">
                            <Setter Property="Visibility" Value="Visible"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>

            </MenuItem>

        </ContextMenu>

如何隐藏上下文菜单中的菜单项?

谢谢

【问题讨论】:

  • 我猜你的命令绑定也不起作用..
  • 命令绑定工作正常。刚刚添加了一个样式来控制可见性。

标签: wpf xaml visual-studio-2012 mvvm


【解决方案1】:

这不起作用有两个原因。

1) 是 ContextMenu 与为其设置的元素不在同一个 VisualTree 中(即它是 PlacementTarget)。您将无法使用 ElementName 绑定到元素。

2) 你把你的 Style 当作 MenuItem 的内容。 (起初我也没有注意到它..)。它需要设置为 MenuItem 的 DependencyProperty 'Style'。

<Grid x:Name="BlotGrid" Background="Red">
     <Grid.ContextMenu>
        <ContextMenu>            
            <MenuItem Name="copyDealContextMenu"
                Header="Copy Deal"        
                CommandParameter="{Binding}">
                 <MenuItem.Style>
                    <Style TargetType="{x:Type MenuItem}">
                        <Setter Property="Visibility" Value="Collapsed"></Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu},Path=PlacementTarget.DataContext.IsXXX}" Value="True">
                                <Setter Property="Visibility" Value="Visible"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </MenuItem.Style>
            </MenuItem>
        </ContextMenu>
    </Grid.ContextMenu>      
</Grid>

【讨论】:

  • 嗨 Eran,ContextMenu 是 Grid 的一部分。右键单击该行,ContextMenu 将出现在数据网格上。尝试了上面的代码,能够按预期在 Xaml 中看到 PlacementTarget.DataContext.ProductType 但样式数据触发器没有被触发,因为我看不到菜单项
  • 检查你的代码我用 IsXXX 属性做的。和一个真值。你有没有改变它来适应你需要的代码。顺便提一句 。我在发布答案之前对其进行了测试。所以请保持开放的心态并检查自己。我说的理由是正确的。
  • ' '
  • 以上代码对我有用。感谢 Eran 的指导。
  • 您应该将其添加到您的问题中。
猜你喜欢
  • 2021-12-20
  • 2018-11-10
  • 2010-11-06
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2018-09-09
相关资源
最近更新 更多