簡體   English   中英

WPF-我如何給帶有孩子的菜單項命令

[英]WPF - how do I give a command to menu item with children

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

我發現了一個名字相似問題 ,但情況有所不同,反正沒有一個好的答案。

將顯示所有項目,但命令僅針對菜單的葉子觸發,而不觸發具有子項的菜單。

是的,這是預期的行為,因為單擊帶有子項的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM