2009-08-28 5 views
2

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).

+0

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

Répondre

2

Voici le xaml qui a fini par fonctionner. Désactiver le bouton radio semble être la clé ici.

En regardant le modèle par défaut aidé beaucoup.

1

Utilisez un MultiBinding au lieu d'une liaison régulière, vous aurez également besoin d'un IMultiValueConverter ici:

<RadioButton.IsChecked> 
    <Binding Path="IsSelected" Mode="TwoWay" RelativeSource="{RelativeSource TemplatedParent}" /> 
</RadioButton.IsChecked> 

que je fais habituellement les exemples moi-même, mais this link si vous donner une bonne idée sur la façon de les utiliser. Sinon, je ferai un exemple simpliste plus tard.

Fondamentalement, ce que vous voulez faire est d'envoyer à la fois IsFocused et isSelected Propriétés de dépendance dans le MultiBinding, puis dans le MultiValueConverter dire quelque chose comme

return (bool)value[0] && (bool)value[1]; 

Lorsque la valeur [0] est IsFocused et la valeur 1 est IsSelected ou vice versa.

Bonne chance!

Questions connexes