如何将顶级MenuItem上的Visibility属性绑定到ViewModel

时间:2011-09-08 17:52:19

标签: wpf xaml data-binding mvvm menu

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

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

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

这对子菜单项有效,但对顶级菜单项没有影响。

我已经找到了一个显示问题的快速示例here(VS2010 .sln)

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

2 个答案:

答案 0 :(得分:4)

    <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}"/>

答案 1 :(得分:1)

您需要在更高级别应用该样式,例如Menu.ItemContainerStyle,这应该只影响最高级别,因此如果您想要影响所有项目,请通过Style.TargetType通过Menu.Resources隐式应用它。