如何通过XAML设置枚举类型子项的MenuItem的IsChecked属性?

4
我已经使用这个解决方案将一个菜单项绑定到了一个枚举上。枚举值被正确地显示出来,但我似乎无法为菜单项的子项设置默认选中值。换句话说,我希望菜单项的一个子项(我使用的枚举值)在默认情况下被选中。我尝试了以下代码,使用了一个样式和一个触发的Setter:
<ContextMenu>
  <MenuItem Header="Some Setting" Name="SomeSettingMenu" DataContext="{Binding}" 
            ItemsSource="{Binding Source={StaticResource DisplayTypeValues}}" 
            Click="SomeSettingClicked">                          

    <MenuItem.ItemContainerStyle>
      <Style TargetType="MenuItem">
        <Setter Property="MenuItem.IsCheckable" Value="True"/>

        <Style.Triggers>
          <Trigger Property="MenuItem.Header" Value="enums:AnEnum.ItemA" >
            <Setter Property="MenuItem.IsChecked" Value="True"/>
          </Trigger>
        </Style.Triggers>

      </Style>                            
    </MenuItem.ItemContainerStyle>

  </MenuItem>
</ContextMenu>

该枚举包含值,例如ItemA,我也尝试在Trigger Value属性中使用AnEnum.First或0(如此处所述),但无济于事。
是否建议使用DataTrigger?如果是这样,我该如何在XAML中编写它?或者,我应该在MenuItem的ItemTemplate中使用DataTemplate吗?
我还尝试通过SomeSetting.Items相关方法进行调整,但大多数属性(例如Current)都是只读的。
我知道你可以在代码后台中编写SomeSettingMenu.ItemsSource = Enum.GetValues(typeof(....)),但是我不知道如何以编程方式选择MenuItem中的项。
我还尝试过这段代码,但也没有用:
<Style.Triggers>
  <DataTrigger Binding="{Binding Path=Header}" Value="enums:DisplayType.ItemA">
    <Setter Property="IsChecked" Value="True" />
  </DataTrigger>                 
</Style.Triggers>
enums 是我正在使用的另一个程序集中的命名空间。任何想法都将不胜感激,非常感谢!

我发现了这篇文章(http://neilmosafi.blogspot.com/2007/08/feb-07-using-combobox-to-select-enum.html),但是当我尝试将其适用于我的MenuItem时,会抛出一个漂亮的异常。有什么想法吗? - Dr1Ku
2个回答

2

您可以这样做。这将绑定到子菜单项的数据上下文,对于第一个项目来说,它是“ItemA”。

<MenuItem.ItemContainerStyle> 
    <Style TargetType="MenuItem">
        <Setter Property="MenuItem.IsCheckable" Value="True"/>
        <Style.Triggers> 
            <DataTrigger Binding="{Binding}" Value="ItemA">
                <Setter Property="MenuItem.IsChecked" Value="True"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</MenuItem.ItemContainerStyle>

2
在您的解决方案中,请考虑更改。
<Trigger Property="MenuItem.Header" Value="enums:AnEnum.ItemA" >

为了

<Trigger Property="MenuItem.Header" Value="{x:Static enums:AnEnum.ItemA}" >

在您的示例中,您检查头部是否等于字符串 "enums:AnEnum.ItemA" 而不是枚举类型 AnEnum 的成员 ItemA。

听起来真是个好消息,我会去查一下然后让你知道。谢谢你对这个问题的贡献! - Dr1Ku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接