我看到很多人提出与我类似的问题,但到目前为止,我还无法将这些部分组合在一起来解决我的问题。
我有一个特定的枚举类型(我们称之为它MyCustomEnum
),我想用它来创建ContextMenu
. 我希望菜单项是可检查的,并将选中的项目MenuItem
绑定到应用程序使用的静态设置(我们将MyCustomEnumSetting
在设置类上调用的属性MyCustomSettingsClass
)。
到目前为止,我能够根据设置值生成ContextMenu
并检查正确的 。MenuItem
我使用 aMultiBinding
将 中的枚举值DataContext
与MenuItem
设置类枚举的值进行比较,并查看它们的值是否相等。但是,绑定只是一种方式:单击未选中的选项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();
}
}
对于我可以去获得我正在寻找的结果的不同方向的任何建议?