如何通过XAML为Enum类型的子元素设置MenuItem的IsChecked属性?

时间:2010-11-29 15:54:39

标签: c# .net wpf xaml enums

我使用this solution将MenuItem绑定到枚举。

Enum值正确显示,但我似乎无法为MenuItem的子项设置默认选中的值。

或者说,我希望MenuItem默认选中其中一个子项(我正在使用的枚举值)。

我尝试了以下代码,使用了Style和触发的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.First0(作为answered here),但无济于事。

DataTrigger是否可取?如果是这样,我怎么能在XAML中写出来? 或者我应该在DataTemplate的{​​{1}}内使用ItemTemplate吗?

我也尝试使用MenuItem相关方法摆弄代码隐藏,但大多数属性(如Current)都是只读的。

我知道你可以在代码隐藏中编写SomeSetting.Items,但我又不知道如何以编程方式在MenuItem中选择一个Item。

我也试过这段代码,但效果不好:

SomeSettingMenu.ItemsSource = Enum.GetValues(typeof(....))

<Style.Triggers> <DataTrigger Binding="{Binding Path=Header}" Value="enums:DisplayType.ItemA"> <Setter Property="IsChecked" Value="True" /> </DataTrigger> </Style.Triggers> 是我正在使用的不同程序集的命名空间。

任何想法都将不胜感激,提前谢谢你!

2 个答案:

答案 0 :(得分:2)

你可以这样做。这将绑定到子MenuItem的DataContext,它是第一个项目的“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>

答案 1 :(得分:2)

在您的解决方案中

考虑更改

<Trigger Property="MenuItem.Header" Value="enums:AnEnum.ItemA" >

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

在您的示例中,您检查标题是否等于 sting“枚举:AnEnum.ItemA”不要枚举AnEnum成员ItemA。