命令绑定到菜单的顶级MenuItem不起作用

时间:2017-12-21 19:37:21

标签: c# wpf

我正在学习WPF并开发一个动态菜单,该菜单由它的ItemsSource与ObservableCollection的数据绑定驱动。为此,我有一个简单的MenuItemViewModel和一个HierarchicalDataTemplate,用于自动将MenuItem绑定到它。

我遇到的问题是Command属性不适用于顶级菜单项。尽管已设置,但MenuItem对鼠标单击没有反应,如果无法执行Command,则不会被禁用。简直就是它没有受到约束。

但是对于较低级别的菜单项,它可以按预期工作。我认为这应该是我的HierarchicalDataTemplate的问题,但我无法找到它,因为我看到模板中没有可能影响顶层MenuItem的命令绑定的代码。 / p>

MenuItemViewModel实现INotifyPropertyChanged并包含以下公共属性:

string Text
Uri ImageSource
ICommand Command
ObservableCollection<MenuItemViewModel> Children
HierarchicalDataTemplate中的MenuItem的

Window.Resources如下:

<HierarchicalDataTemplate DataType="{x:Type common:MenuItemViewModel}"
                          ItemsSource="{Binding Path=Children}">

    <HierarchicalDataTemplate.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command"
                Value="{Binding Command}" />
        </Style>
    </HierarchicalDataTemplate.ItemContainerStyle>

    <StackPanel Orientation="Horizontal">
        <Image Source="{Binding ImageSource}" />
        <TextBlock Text="{Binding Text}" VerticalAlignment="Center"/>
    </StackPanel>

</HierarchicalDataTemplate>

你能指出我的错误吗?

编辑:顶级MenuItem不包含任何子节点(即关联的ViewModel的Children集合为空)。

1 个答案:

答案 0 :(得分:0)

感谢@sTrenat comment我已经解决了以下问题。

<Menu.Resources>
    <!-- cancel sharing of image so Icon will work properly -->
    <Image x:Key="MenuIcon" Source="{Binding ImageSource}" x:Shared="False"/>
</Menu.Resources>

<Menu.ItemContainerStyle>
    <Style TargetType="{x:Type MenuItem}"
           BasedOn="{StaticResource {x:Type MenuItem}}">
        <Setter Property="Header" Value="{Binding Text}" />
        <Setter Property="Icon" Value="{StaticResource MenuIcon}"/>
        <Setter Property="Command" Value="{Binding Command}"/>
        <Setter Property="ItemsSource" Value="{Binding Children}" />

        <!-- centering MenuItem's Header -->
        <Setter Property="HeaderTemplate">
            <Setter.Value>
                <DataTemplate>
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding}" />
                </DataTemplate>
            </Setter.Value>
        </Setter>

        <!-- setting Icon to null when ImageSource isn't specified -->
        <Style.Triggers>
            <DataTrigger Binding="{Binding ImageSource}"
                        Value="{x:Null}">
                <Setter Property="Icon" Value="{x:Null}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Menu.ItemContainerStyle>