Подтвердить что ты не робот

WPF: Есть ли способ получить исходные значения в методе ConvertBack MultiValueConverter?

Я написал MultiValueConverter, который проверяет, содержит ли данный список заданное значение и возвращает true, если это произойдет. Я использую его для привязки к настраиваемому списку флажков. Теперь я хотел бы написать метод 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>

Я получаю правильные результаты, когда я привязываюсь, но есть ли способ получить связанный идентификатор при обратном преобразовании? То, что я хотел бы достичь, заключается в том, что если флажок не установлен, значение будет удалено из списка, и если оно будет отмечено, значение будет добавлено в список.

4b9b3361

Ответ 1

Я знаю, что это старая проблема, но это решение может помочь кому-то другому.

Вместо использования ConvertBack метода IMultiValueConverter вы можете установить привязку IsChecked как OneWay и использовать свойство CheckBox 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 действительно бесполезен - я не могу придумать слишком много применений для него, не имея доступа к текущим значениям привязки.

Ответ 2

Я решил свою проблему, и, надеюсь, решение вам тоже поможет. Возьмите многосвязывание, которое у вас есть, и вместо того, чтобы поместить его в атрибут IsChecked, поместите его в атрибут DataContext. Это может быть, где наши проблемы отличаются... в моем методе конвертирования, я использовал данные в привязках, чтобы захватить объект, а затем я вернул myobject.text. Я изменил это, вместо этого верну только объект, так что он привязан к datacontext. Затем я привязал свойство textbox.text к текстовому свойству myobject. он работает нормально. Затем вы можете связать список, в котором значения будут удалены в 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>