关于wpf:如何将顶级MenuItem上的Visibility属性绑定到ViewModel

How can I bind the Visibility property on a top level MenuItem to a ViewModel

我正在使用以下HierarchicalDataTemplate将MenuViewModels的集合绑定到Menu控件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<HierarchicalDataTemplate
    DataType="{x:Type common:MenuViewModel}"
    ItemsSource="{Binding Path=Children}">

    <HierarchicalDataTemplate.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding Command}"/>
            <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource ResourceKey=boolToCollapsedConverter}}" />
        </Style>
    </HierarchicalDataTemplate.ItemContainerStyle>

    <ContentPresenter
        Content="{Binding Name}"
        RecognizesAccessKey="True" />

</HierarchicalDataTemplate>

一切正常,但是我需要根据特定状态删除某些菜单项(例如,如果编辑屏幕处于活动状态,我可能只想显示" Edit"顶级菜单)我在MenuViewModel上有一个IsVisible属性,该属性又通过booleanToVisibility转换器绑定到MenuItem的Visibility属性(在HierarchialDataTameplate.ItemContainerStyle中设置,我认为这是我的问题所在)。

这在子菜单项上工作正常,但对顶级菜单项没有影响。

我已经整理了一个简单的示例,在这里显示了问题(VS2010 .sln)

我的问题是:如何将顶级MenuItem的可见性属性绑定到ViewModel?


1
2
3
4
5
6
7
8
9
    <Style x:Key="MenuItemStyle" TargetType="{x:Type MenuItem}">
        <Setter Property="Command" Value="{Binding Command}"/>
        <Setter Property="Visibility" Value="{Binding IsVisible, Converter={StaticResource ResourceKey=boolToCollapsedConverter}}" />
    </Style>


snip...

<Menu DockPanel.Dock="Top" ItemsSource="{Binding Path=MainMenu}" ItemContainerStyle="{DynamicResource MenuItemStyle}"/>


您需要在更高级别上应用样式,例如Menu.ItemContainerStyle,但这只会影响顶层,因此,如果要影响所有项目,请通过Style.TargetTypeMenu.Resources隐式地应用它。