Bindung RadioButton IsChecked zu ListBoxItem IsSelected ListBox und IsFocused

Ich habe gesehen, andere Fragen, die sehr ähnlich zu diesem, aber irgendwie habe ich immer noch nicht bekommen kann es arbeiten. Hier ist das Szenario.

Was ich
Ich habe eine ListBox zeigt eine Liste meiner Modelle ansehen. Jedes view model hat eine Liste von Kindern, die angezeigt werden, in einem anderen, verschachtelten Liste. Ich bin mit einem DataTemplate um dies zu erreichen.

, Was Ich Will
Ich will, dass die Kinder Gegenstände haben eine RadioButton ist, die ausgewählt ist, wenn die ListBoxItem ausgewählt ist, und wenn die ListBox Fokus hat (das innere ListBox).

Derzeit, die IsSelected Teil der oben funktioniert wunderbar, jedoch wenn ich mich bewege, von einer Ansicht Modell, um die anderen (d.h. die ersten ListBox den Fokus verliert) den radio-button auf der ersten ListBox ausgewählt bleibt.

Hier ist der code:

        <Style TargetType="{x:Type ListBox}">
        <Setter Property="ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="{x:Type ListBoxItem}" >
                    <Setter Property="Margin" Value="2" />
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                <RadioButton Focusable="False">
                                    <RadioButton.Style>
                                        <Style TargetType="{x:Type RadioButton}">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Path=IsFocused, Mode=OneWay, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBox}}}" Value="False">
                                                    <Setter Property="IsChecked" Value="False"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </RadioButton.Style>
                                    <RadioButton.IsChecked>
                                        <Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}" />
                                    </RadioButton.IsChecked>
                                    <ContentPresenter></ContentPresenter>
                                </RadioButton>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </Setter.Value>
        </Setter>
    </Style>

Habe ich auch schon versucht MultiBinding, aber das war nicht entweder. Irgendwelche Vorschläge?

UPDATE
Update zu zählen mein Versuch MultiBinding:

<ControlTemplate TargetType="{x:Type ListBoxItem}">
<RadioButton>
<RadioButton.IsChecked>
    <MultiBinding>
        <MultiBinding.Converter>
            <DataExportTool:AllTrueConverter/>
        </MultiBinding.Converter>
        <Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}"/>
        <Binding Path="IsFocused" Mode="OneWay" RelativeSource="{RelativeSource TemplatedParent}"/>
    </MultiBinding>
</RadioButton.IsChecked>
<ContentPresenter/>
</RadioButton>
</ControlTemplate>

Dem Konverter:

public class AllTrueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values.Cast<bool>().All(x => x);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        return Enumerable.Repeat((bool)value, 2).Cast<object>().ToArray();
    }
}

Den IsSelected Teil dieser großen Werke, d.h. nur ein Element in der Liste hat der radiobutton ausgewählt ist jederzeit möglich. Allerdings, wenn das Steuerelement verliert Fokus das ausgewählte Element ein radio-button ist immer noch ausgewählt ist (nicht das, was ich will).

  • Sorry, ich lese Sie versucht MultiBinding NACH der Beantwortung. Würden Sie mir erklären, wie du es gemacht hast?
InformationsquelleAutor Kelly | 2009-08-28
Schreibe einen Kommentar