我如何在通过HierarchicalDataTemplate wpf生成的菜单项和子菜单项中保留两个不同的命令

时间:2018-07-25 06:54:06

标签: wpf mvvm data-binding menu command

在下面的代码中,嵌套菜单是从一个名为CollectionOfAuthors的可观察集合中生成的。我放置了两个命令,一个位于“ ToplevelMenuItem”,另一个用于子菜单项(通过textblock.InputBindings)。 虽然子菜单的命令正在运行,但是我无法点击TopLevelMenuItem的命令:

需要了解我还需要做什么?

<MenuItem x:Name="TopLevelMenuItem" Header="Authors" ItemsSource="{Binding CollectionOfAuthors}"  Command="{Binding DataContext.RefreshAuthorsList, RelativeSource={RelativeSource AncestorType=Menu}}"     >
    <MenuItem.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Books}">
            <TextBlock Text="{Binding AuthorName}"/>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding BookName}" >
                                    <TextBlock.InputBindings>
                                                        <MouseBinding Command="{Binding DataContext.NavigateToBook, RelativeSource={RelativeSource AncestorType=Menu}}"  MouseAction="LeftClick" />                                                                                                                  
                                   </TextBlock.InputBindings>
                    </TextBlock>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </MenuItem.ItemTemplate>
</MenuItem>

1 个答案:

答案 0 :(得分:1)

尝试

<MenuItem x:Name="TopLevelMenuItem" Header="Authors" ItemsSource="{Binding CollectionOfAuthors}" >
  <i:Interaction.Triggers>
    <i:EventTrigger EventName="SubmenuOpened">
      <i:InvokeCommandAction Command="{Binding DataContext.RefreshAuthorsList}"/>
    </i:EventTrigger>
  </i:Interaction.Triggers>

如果要阻止从子菜单中触发命令,则需要将{Binding .}传递给命令,并且如果param不是ViewModel的类型,则不要触发操作。

此外,您需要添加对System.Windows.Interactivity和 xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"在您的xaml标头中