我看到很多人都在问类似我的问题,但到目前为止我还没能把各个部分放在一起解决我的问题。
我有一个枚举类型(让我们称之为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
我可以采取任何不同方向的建议来获得我正在寻找的结果吗?
答案 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>