WPF: есть ли способ получить исходные значения в методе ConvertBack MultiValueConverter? - PullRequest
11 голосов
/ 10 февраля 2010

Я написал 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>

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

Ответы [ 2 ]

6 голосов
/ 14 февраля 2012

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

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

5 голосов
/ 21 мая 2010

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

...