0

我看到很多人提出与我类似的问题,但到目前为止,我还无法将这些部分组合在一起来解决我的问题。

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

到目前为止,我能够根据设置值生成ContextMenu并检查正确的 。MenuItem我使用 aMultiBinding将 中的枚举值DataContextMenuItem设置类枚举的值进行比较,并查看它们的值是否相等。但是,绑定只是一种方式:单击未选中的选项MenuItem不会更新绑定。我觉得我错过了一些东西,但是 WPF 的这一部分对我来说有点模糊。

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

<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

public sealed class EnumEqualsConverter : IMultiValueConverter
{
    object IMultiValueConverter.Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        IEnumerable<Enum> enums = values.Cast<Enum>();
        var value1 = enums.ElementAt(0);
        var value2 = enums.ElementAt(1);
        return value1.Equals(value2);
    }

    object[] IMultiValueConverter.ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

对于我可以去获得我正在寻找的结果的不同方向的任何建议?

4

1 回答 1

1

您已经使用多重绑定来检查您的复选框。除非您在 MultiValueConverter 的 ConvertBack 方法中做了一些魔术,否则这将是一种方法。您想要实现的事情可以如下完成:

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

     <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding MyCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
                    <Setter Property="CommandParameter" Value="{Binding}"/>
      </Style>
于 2013-09-13T04:17:15.330 回答