【问题标题】:WPF - how do I give a command to menu item with childrenWPF - 我如何给带有孩子的菜单项命令
【发布时间】:2016-12-06 09:32:56
【问题描述】:

我在 WPF 中有一个数据绑定分层菜单。显示所有项目,但命令仅针对菜单的叶子触发,而不是具有子项的项。我猜该命令被扩展子菜单覆盖... 即使对于带有子项的菜单项,我如何才能执行命令?

我现在拥有的是

<UserControl ...>
    <WrapPanel>
        <Menu>
            <Menu.Resources>
                <Style x:Key="MenuItemStyle" TargetType="MenuItem" d:DataContext="{d:DesignInstance local:TreeItem}">
                    <Setter Property="Command" Value="{Binding DataContext.AddColumnCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
                    <Setter Property="CommandParameter" Value="{Binding}"/>
                </Style>
            </Menu.Resources>
            <MenuItem Header="Add ▼" ItemsSource="{Binding AvailableFields}">
                <MenuItem.ItemTemplate>
                    <HierarchicalDataTemplate DataType="{x:Type local:TreeItem}" ItemsSource="{Binding NestedItems}" ItemContainerStyle="{StaticResource MenuItemStyle}">
                        <ContentPresenter Content="{Binding Annotation}"/>
                    </HierarchicalDataTemplate>
                </MenuItem.ItemTemplate>
            </MenuItem>
        </Menu>
    </WrapPanel>
</UserControl>

我找到了question with a similar name,但情况不同,反正也没有好的答案。

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    显示所有项目,但命令仅针对菜单的叶子触发,而不是具有子项的项。

    是的,这是预期的行为,因为单击带有子项的 MenuItem 应该会展开子项的子菜单。它不执行命令。

    如果您想展开子项并执行命令,您可以处理 MenuItem 的 PreviewMouseLeftButtonDown 事件:

    <Style TargetType="{x:Type MenuItem}">
        <Setter Property="Command" Value="{Binding DataContext.AddColumnCommand, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnMouseDown" />
    </Style>
    

    -

    private void OnMouseDown(object sender, MouseButtonEventArgs e)
    {
        MenuItem mi = sender as MenuItem;
        if (mi != null && mi.Command != null && mi.HasItems)
             mi.Command.Execute(mi.CommandParameter);
    }
    

    请注意,在视图的代码隐藏中处理事件并不会真正破坏此处的 MVVM 模式,因为您只是从代码隐藏调用视图模型的命令,而不是从 XAML 标记调用它相同的看法。但如果您不喜欢这种方法,您可以使用附加行为:https://www.codeproject.com/articles/28959/introduction-to-attached-behaviors-in-wpf

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2016-02-29
      • 1970-01-01
      • 2011-04-15
      • 2010-12-18
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 2016-07-13
      相关资源
      最近更新 更多