如何根据条件在WPF XAML中隐藏上下文菜单的菜单项

3

在我的xaml中,我使用了WPF ContextMenu来显示WPF DataGrid中的菜单项。根据条件,我需要隐藏菜单项。我尝试了以下方法但无效。

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

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

我猜测你的命令绑定也没有起作用。 - eran otzap
命令绑定正常工作。只是添加了一个控制可见性的样式。 - Tarun
1个回答

6

这个方法没有起作用的原因有两个:

第一,ContextMenu没有和它所依附的元素(即 PlacementTarget)在同一个VisualTree中。因此,你不能使用ElementName来绑定元素。

第二,你把Style放在了MenuItem的Content里面(我开始也没有注意到..)。它需要设置为你的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将出现在datagrid上。尝试了上面的代码,能够像预期的那样在Xaml中看到PlacementTarget.DataContext.ProductType,但是由于我无法看到菜单项,所以样式数据触发器没有被触发。 - Tarun
检查您的代码,我使用了一个IsXXX属性和True值。您是否更改了它以满足您的需求?顺便说一下,我在发布答案之前进行了测试,请保持开放的心态并自行检查。我所述的原因是合理的。 - eran otzap
<MenuItem.Style> <Style TargetType="{x:Type MenuItem}"> <Setter Property="Visibility" Value="Collapsed"></Setter> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=DataGrid},Path=DataContext.ProductType}" Value="FXO"> <Setter Property="Visibility" Value="Visible"></Setter> </DataTrigger> </Style.Triggers> </Style> </MenuItem.Style> - Tarun
以上代码对我有效。感谢Eran提供的指导。 - Tarun
你应该将其添加到你的问题中。 - eran otzap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接