0

多くの人が私のような質問をしているのを見ますが、これまでのところ、問題を解決するために断片をまとめることができませんでした.

MyCustomEnumで選択リストを作成するために使用したい特定の列挙型( と呼びましょう)がありContextMenuます。メニュー項目をチェック可能にして、アプリケーションが使用する静的設定 (設定クラスでMenuItem呼び出すプロパティ)にチェックをバインドしたいと思います。MyCustomEnumSettingMyCustomSettingsClass

これまでのところ、設定値に基づいてを生成しContextMenu、正しい を確認できました。の列挙型の値を設定クラスの列挙型の値と比較し、それらの値が等しいかどうかを確認するためにMenuItemを使用してこれを行いました。ただし、バインドは 1 つの方法にすぎません。チェックされていないものをクリックしても、バインドは更新されません。私は何かが欠けていると感じていますが、WPF のこの部分は私にはもう少しあいまいです。MultiBindingDataContextMenuItemMenuItem

これが私がこれまでに持っているものです:

<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 メソッドで何らかの魔法をかけていない限り、これは 1 つの方法です。あなたが達成したいことは、以下のように行うことができます:

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 に答える