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?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist der xaml-Code, der landete. Deaktivieren Sie die radio-Taste scheint hier der Schlüssel.
Blick auf die Standard-Vorlage viel geholfen.
Verwenden Sie ein MultiBinding statt einer regulären Verbindlich, Sie müssen auch eine IMultiValueConverter hier:
Normalerweise mache ich die Beispiele selbst, aber dieser link sollte Ihnen eine gute Idee wie diese zu nutzen sind. Wenn nicht, werde ich ein einfaches Beispiel später.
Im Grunde, was Sie tun möchten, senden beide IsFocused und IsSelected Abhängigkeit von Eigenschaften in der MultiBinding, dann in der MultiValueConverter etwas sagen wie
Wobei value[0] IsFocused und WertEins ist IsSelected oder Umgekehrt.
Glück!