动态隐藏菜单项

时间:2014-03-12 20:10:16

标签: wpf xaml menu

我有一个使用xaml构建的菜单,而MenuItem将属性ItemTemplate设置为以下模板:

<HierarchicalDataTemplate x:Key="MenuItemTemplate" DataType="{x:Type mainMenu:MenuItem}" ItemsSource="{Binding ChildMenuItems}">
     <MenuItem Command="{Binding Command}" CommandParameter="{Binding CommandParameter}" Header="{Binding Path=Header}" Visibility="{Binding Visible, Converter={converter:BooleanToVisibilityConverter}}" />
</HierarchicalDataTemplate>

当我将属性Visible的值更改为false以隐藏子菜单时,结果是:

enter image description here

子菜单被隐藏但仍占用一些空间。如何更改它以适应菜单中剩余的项目数?

修改

这里是转换器的代码:

public class BooleanToVisibilityConverter : MarkupExtension, IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool) value ? Visibility.Visible : Visibility.Collapsed;
    }
}

3 个答案:

答案 0 :(得分:1)

我怀疑你从转换器返回Visibility.Hidden。而是返回Visibility.Collapsed

来自MSDN

enter image description here


此外,WPF提供BooleanToVisibilityConverter,除非做一些额外的事情,否则你不需要重新定义它。您可以在App资源部分下添加资源,并使用:

<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>

答案 1 :(得分:1)

您不应该使用HierarchicalDataTemplate来定义您的孩子MenuItem。相反,请尝试使用MenuItem.ItemsSource属性:

<DataTemplate x:Key="MenuItemTemplate" DataType="{x:Type mainMenu:MenuItem}">
    <MenuItem Command="{Binding Command}" CommandParameter="{Binding CommandParameter}"
        Header="{Binding Path=Header}" Visibility="{Binding Visible, Converter={
        converter:BooleanToVisibilityConverter}}" 
        ItemsSource="{Binding ChildMenuItems}" />
</DataTemplate>

更新&gt;&gt;&gt;

对不起,您需要将MenuItem集中的子Style属性设置为MenuItem.ItemContainerStyle。我不想在这里解释所有内容,而是希望引导您访问MSDN上Lester的WPF \ SL博客的Binding menus using HeirarchicalDataTemplates页面,该页面解释了如何做好。

此外,如果您要对MenuItem进行数据绑定,那么您也可以从数据绑定集合中删除相关项,而不是尝试设置Visibility。用户界面看起来会一样,但会更简单。最好尽可能在WPF中操作数据元素,而不是UI元素。

答案 2 :(得分:0)

我没有使用绑定进行测试,但我在

之前使用了成功使用的绑定方式
<Menu>
    <Menu.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="Visibility" Value="Collapsed" />
        </Style>
    </Menu.Resources>
    <MenuItem Header="ONe" />
    <MenuItem Header="Two" />
    <MenuItem Header="Three" />
</Menu>