从枚举值列表中创建可检查的上下文菜单

时间:2013-09-13 02:10:41

标签: wpf enums contextmenu

我看到很多人都在问类似我的问题,但到目前为止我还没能把各个部分放在一起解决我的问题。

我有一个枚举类型(让我们称之为MyCustomEnum),我想用它来创建ContextMenu中的选项列表。我希望菜单项可以检查,并将选中的MenuItem绑定到应用程序使用的静态设置(我们将在设置类MyCustomEnumSetting上调用MyCustomSettingsClass的属性)

到目前为止,我可以根据设置值生成ContextMenu并检查正确的MenuItem。我使用MultiBinding执行此操作,将DataContext的{​​{1}}中的枚举值与设置类枚举的值进行比较,看看它们的值是否相等。但是,绑定只是一种方式:单击未选中的MenuItem不会更新绑定。我有一种感觉,我错过了一些东西,但WPF的这一部分对我来说有点模糊。

这是我到目前为止所拥有的:

MenuItem

<UserControl> <UserControl.Resources> <ObjectDataProvider MethodName="GetValues" ObjectType="{x:Type system:Enum}" x:Key="MyCustomEnumProvider"> <ObjectDataProvider.MethodParameters> <x:Type Type="local:MyCustomEnum" /> </ObjectDataProvider.MethodParameters> </ObjectDataProvider> <local:EnumEqualsConverter x:Key="EnumEqualsConverter" /> </FrameworkElement.Resources> <FrameworkElement.ContextMenu> <ContextMenu ItemsSource="{Binding Source={StaticResource MyCustomEnumProvider}}"> <ContextMenu.ItemContainerStyle> <Style TargetType="MenuItem"> <Setter Property="IsChecked"> <Setter.Value> <MultiBinding Converter="{StaticResource EnumEqualsConverter}"> <MultiBinding.Bindings> <!--First binding source is the application setting value--> <Binding Source="{x:Static local:MyCustomSettingsClass.Default}" Path="MyCustomEnumSetting" /> <!--Second binding source is the enum value in the data context of the MenuItem--> <Binding RelativeSource="{RelativeSource Self}" Path="DataContext" Mode="OneWay" /> </MultiBinding.Bindings> </MultiBinding> </Setter.Value> </Setter> </Style> </ContextMenu.ItemContainerStyle> </ContextMenu> </FrameworkElement.ContextMenu> </FrameworkElement> 的代码:

IMultiValueConverter

我可以采取任何不同方向的建议来获得我正在寻找的结果吗?

1 个答案:

答案 0 :(得分:1)

您已使用Multibinding检查复选框..除非您在MultiValueConverter的ConvertBack方法中做了一些魔术,否则它将是一种方式。您想要实现的目标可以如下所示:

使用MultiBinding,您可以将Menuitem绑定到VM / codebeind上的命令,并在CommandParameter中发送Menuitem的DataContext。在您的commmand处理程序中,您可以使用命令参数更新静态属性。

     <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding MyCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
                    <Setter Property="CommandParameter" Value="{Binding}"/>
      </Style>