11

指定されたリストに指定された値が含まれているかどうかをチェックし、含まれている場合は true を返す MultiValueConverter を作成しました。カスタムチェックボックスリストへのバインドに使用します。ここで、ConvertBack メソッドを記述して、チェックボックスがオンになっている場合に元の値がモデルに送信されるようにします。ConvertBack メソッドで値にアクセスする方法はありますか?

XAML:

<ListBox.ItemTemplate>
    <HierarchicalDataTemplate>
        <CheckBox Content="{Binding Path=Description}">
            <CheckBox.IsChecked>
                <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}">
                    <Binding Path="Id" />
                    <Binding Path="DataContext.ContactTypes" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
                </MultiBinding>
            </CheckBox.IsChecked>
        </CheckBox>
    </HierarchicalDataTemplate>
</ListBox.ItemTemplate>

バインドすると正しい結果が得られますが、元に戻すときにバインドされた ID を取得する方法はありますか? 私が達成したいのは、チェックボックスがチェックされていない場合、値がリストから削除され、チェックされている場合、値がリストに追加されることです。

4

2 に答える 2

6

これは古い問題であることは知っていますが、この解決策は他の人を助けるかもしれません。

ConvertBackのメソッドを使用する代わりに、バインディングを にIMultiValueConverter設定し、プロパティを使用してチェック ロジックを実行できます。IsCheckedOneWayCheckBox Command

<ListBox.ItemTemplate>
    <HierarchicalDataTemplate>
        <CheckBox Content="{Binding Path=.}" Command="{Binding Path=CheckBoxCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" CommandParameter="{Binding Path=.}">
            <CheckBox.IsChecked>
                <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}" Mode="OneWay">
                    <Binding Path="." />
                    <Binding Path="SelectedItems" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
                </MultiBinding>
            </CheckBox.IsChecked>
        </CheckBox>
    </HierarchicalDataTemplate>
</ListBox.ItemTemplate>

次に、次のような処理を実行する CheckBoxCommand を追加します。

    // the items bound to your checkbox
    public Collection<string> Items { get; set; }

    // the list of selected items
    public Collection<string> SelectedItems { get; set; }

    private void ExecuteCheckBoxCommand(string obj)
    {
        SelectedItems.Add(obj);
    }

これを行うには少し回りくどい方法であることはわかっていますが、このIMultiValueConverter.ConvertBack方法は実際にはまったく役に立ちません。現在のバインディング値にアクセスせずに使用する方法が多すぎるとは考えられません。

于 2012-02-14T00:15:28.057 に答える
5

私は私の問題を解決しました。解決策があなたにも役立つことを願っています。あなたが持っているマルチバインディングを取り、それを IsChecked 属性に入れる代わりに、DataContext 属性に入れます。これが私たちの問題の違いかもしれません... 私の convert メソッドでは、バインディングのデータを使用してオブジェクトを取得し、myobject.text を返しました。これを代わりにオブジェクトだけを返すように変更して、データコンテキストにバインドされるようにしました。次に、textbox.text プロパティを myobject の text プロパティにバインドしました。それはうまくいくようです。次に、値が削除されたリストをcheckbox.ischeckedにバインドできます...推測します。あなたが何をしようとしているのか正確にはわかりません。

私はこれがあなたを正しい道に導くかもしれないと思っています...

<ListBox.ItemTemplate>
<HierarchicalDataTemplate>
    <CheckBox Content="{Binding Path=Description}">
        <CheckBox.DataContext>
            <MultiBinding Converter="{x:Static Classes:ListContainsMultiConverter.Instance}">
                <Binding Path="Id" />
                <Binding Path="DataContext.ContactTypes" RelativeSource="{RelativeSource AncestorType={x:Type Window}}" />
            </MultiBinding>
        </CheckBox.DataContext>
        <CheckBox.IsChecked>
            <Binding Path="Some_Property_For_IsChecked_In_Some_Object_In_The_Converter" />
        </CheckBox.IsChecked>
    </CheckBox>
</HierarchicalDataTemplate>

于 2010-05-20T20:59:34.917 に答える