如何根据条件隐藏wpf xaml中上下文菜单的菜单项

Tar*_*run 3 wpf xaml mvvm visual-studio-2012

在我的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>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

era*_*zap 6

这不起作用有两个原因。

1) ContextMenu 与它所设置的元素(即它的 PlacementTarget)并不驻留在同一个 VisualTree 中。您将无法绑定到具有ElementName的元素。

2)您将样式设置为 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>
Run Code Online (Sandbox Code Playgroud)