J'ai vu d'autres questions très similaires à cela, mais je n'arrive toujours pas à le faire fonctionner. Voici le scénario.Liaison RadioButton IsChecked à ListBoxItem isSelected et ListBox isFocused
Ce que je j'ai un ListBox
qui affiche une liste de mes modèles de vue. Chaque modèle de vue a une liste d'enfants qui sont affichés dans une autre zone de liste imbriquée. J'utilise un DataTemplate
pour y parvenir.
Ce que je veux Je veux que les articles pour enfants d'avoir un RadioButton
sélectionné lorsque le ListBoxItem
est sélectionné et lorsque le ListBox
a le focus (la ListBox
intérieure). Actuellement, la partie IsSelected
fonctionne très bien, mais lorsque je passe d'un modèle de vue à l'autre (c'est-à-dire que le premier module ListBox perd le focus), le bouton radio sur le premier ListBox
reste sélectionné.
Voici le 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>
J'ai aussi essayé MultiBinding
, mais qui ne fonctionnait pas non plus. Aucune suggestion?
MISE À JOUR mise à jour pour inclure ma tentative 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>
Et le convertisseur:
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();
}
}
La IsSelected
partie de ce fonctionne très bien, à savoir un seul élément de la liste a le radiobutton sélectionné à tout moment. Cependant, lorsque le contrôle perd son focus, le bouton radio de l'élément sélectionné est toujours sélectionné (pas ce que je veux).
Désolé, j'ai lu que vous avez essayé de répondre à MultiBinding AFTER. Cela vous dérangerait-il d'expliquer comment vous l'avez fait? – Carlo