多くの人が私のような質問をしているのを見ますが、これまでのところ、問題を解決するために断片をまとめることができませんでした.
MyCustomEnum
で選択リストを作成するために使用したい特定の列挙型( と呼びましょう)がありContextMenu
ます。メニュー項目をチェック可能にして、アプリケーションが使用する静的設定 (設定クラスでMenuItem
呼び出すプロパティ)にチェックをバインドしたいと思います。MyCustomEnumSetting
MyCustomSettingsClass
これまでのところ、設定値に基づいてを生成しContextMenu
、正しい を確認できました。の列挙型の値を設定クラスの列挙型の値と比較し、それらの値が等しいかどうかを確認するためにMenuItem
を使用してこれを行いました。ただし、バインドは 1 つの方法にすぎません。チェックされていないものをクリックしても、バインドは更新されません。私は何かが欠けていると感じていますが、WPF のこの部分は私にはもう少しあいまいです。MultiBinding
DataContext
MenuItem
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
:
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();
}
}
私が探している結果を得るために行くことができる別の方向への提案はありますか?