WPF XAML - 带有 ItemSource 和子菜单项的 MenuItem

apc*_*apc 5 .net wpf xaml

我在上下文菜单中有一个 MenuItem,我想使用 ItemSource 为列表中的每个项目生成子 MenuItem。这些生成的项目中的每一个还应该有子菜单项活动(可检查)、编辑和删除。

Custom Messages
    -Custom Message 1
           -Active 
           -Edit
           -Delete
    -Custom Message 2
           -Active 
           -Edit
           -Delete
    -Custom Message 3
           -Active 
           -Edit
           -Delete
Run Code Online (Sandbox Code Playgroud)

以下 XAML 部分有效:

<MenuItem Header="Custom Messages" Visibility="{Binding Path=HasCustomMessages, Converter={StaticResource BVC}}" ItemsSource="{Binding Path=CustomMessages}" DisplayMemberPath="Description">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="ItemsSource">
                <Setter.Value>
                    <x:Array Type="FrameworkElement">
                        <MenuItem Header="Active" IsCheckable="True" IsChecked="{Binding Path=Active}"></MenuItem>
                        <Separator></Separator>
                        <MenuItem Header="Edit" Name="EditCustomMessageButton" Click="EditCustomMessageButton_Click" Style="{x:Null}"></MenuItem>
                        <MenuItem Header="Delete" Name="DeleteCustomMessageButton" Click="DeleteCustomMessageButton_Click" Style="{x:Null}"></MenuItem>
                    </x:Array>
                </Setter.Value>
            </Setter>
        </Style>
    </MenuItem.ItemContainerStyle>                       
</MenuItem>
<MenuItem Header="Add Custom Message" Name="AddCustomMessageButtton" Click="AddCustomMessageButtton_Click"></MenuItem>
<Separator></Separator>
<MenuItem Header="Delete" Name="DeleteButton" Click="DeleteButton_Click"></MenuItem>
Run Code Online (Sandbox Code Playgroud)

但是有两个问题:

  1. 编辑和删除似乎以递归方式运行,因为它们似乎都有子菜单,随后在悬停时抛出和异常: 子菜单异常

  2. 通过在 Edit 和 Delete 上设置 ItemSource="{x:Null}" 这解决了上述问题,但事件的行为很奇怪。单击“删除”不执行任何操作,单击“编辑”会触发“编辑”按钮单击事件,然后是“删除”按钮单击事件,然后是“添加”按钮单击事件(它甚至不是其他两个按钮的同级事件)。

Ami*_*ira 5

问题是您将所有样式设置MenuItem为与子菜单相同,这导致了无限递归 - StackOverflow :-) 问题。下面这行是错误的:

<Style TargetType="MenuItem">
Run Code Online (Sandbox Code Playgroud)

因此,您可以在资源中创建此样式并通过其 x:Key 调用它:

<Style x:Key="SubMenuStyle">
    <Setter Property="ItemsSource">
        <Setter.Value>
            <x:Array Type="FrameworkElement">
                <MenuItem Header="Active" IsCheckable="True" IsChecked="{Binding Path=Active}"></MenuItem>
                <Separator></Separator>
                <MenuItem Header="Edit" Name="EditCustomMessageButton" Click="EditCustomMessageButton_Click" Style="{x:Null}"></MenuItem>
                <MenuItem Header="Delete" Name="DeleteCustomMessageButton" Click="DeleteCustomMessageButton_Click" Style="{x:Null}"></MenuItem>
            </x:Array>
        </Setter.Value>
    </Setter>
</Style>


<MenuItem Header="Custom Messages" ItemsSource="{Binding Path=CustomMessages}" ItemContainerStyle="{StaticResource SubMenuStyle}"...>
Run Code Online (Sandbox Code Playgroud)