2010-05-28 6 views
1

J'ai un UserControl avec une liste déroulante groupée avec des expandeurs et je ne veux qu'un seul expandeur ouvert à tout moment. J'ai parcouru le site mais n'ai rien trouvé à part liant le IsExpanded à IsSelected qui n'est pas tout à fait ce que je veux.WPF - Un seul expandeur doit être ouvert à la fois dans la zone de liste groupée

J'essaie de mettre du code dans l'événement Expanded qui passerait en boucle dans Expanders et fermerait tous ceux qui ne sont pas l'expanseur passé dans l'événement Expanded. Je n'arrive pas à comprendre comment les atteindre. J'ai essayé ListBox.Items.Groups mais je n'ai pas vu comment les atteindre et j'ai essayé ListBox.ItemContainerGenerator.ContainerFromItem (ou Index) mais rien n'est revenu.

Merci

Voici le balisage actuel:

<ListBox Name="ListBox"> 
<ListBox.GroupStyle> 
<GroupStyle> 
    <GroupStyle.ContainerStyle> 
    <Style TargetType="{x:Type GroupItem}"> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type GroupItem}"> 
      <Border BorderBrush="CadetBlue" BorderThickness="1"> 
       <Expander BorderThickness="0,0,0,1" Expanded="Expander_Expanded" 
         Focusable="False" 
         IsExpanded="{Binding IsSelected, 
         RelativeSource={RelativeSource FindAncestor, AncestorType= 
               {x:Type ListBoxItem}}}" > 
       <Expander.Header> 
        <Grid> 
        <StackPanel Height="30" Orientation="Horizontal"> 
         <TextBlock Foreground="Navy" FontWeight="Bold" 
           Text="{Binding Path=Name}" Margin="5,0,0,0" 
           MinWidth="200" Padding="3" 
           VerticalAlignment="Center" /> 
         <TextBlock Foreground="Navy" FontWeight="Bold" 
           Text=" Setups: " VerticalAlignment="Center" 
           HorizontalAlignment="Right"/> 
         <TextBlock Foreground="Navy" FontWeight="Bold" 
           Text="{Binding Path=ItemCount}" 
           VerticalAlignment="Center" 
           HorizontalAlignment="Right" /> 
        </StackPanel> 
        </Grid> 
       </Expander.Header> 
       <Expander.Content> 
        <Grid Background="white" > 
        <ItemsPresenter /> 
        </Grid> 
       </Expander.Content> 
       <Expander.Style > 
        <Style TargetType="{x:Type Expander}"> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="true"> 
         <Setter Property="Background"> 
          <Setter.Value> 
          <LinearGradientBrush StartPoint="0,0" 
               EndPoint="0,1"> 
           <GradientStop Color="WhiteSmoke" 
              Offset="0.0" /> 
           <GradientStop Color="Orange" Offset="1.0" /> 
          </LinearGradientBrush> 
          </Setter.Value> 
         </Setter> 
         </Trigger> 
         <Trigger Property="IsMouseOver" Value="false" 
         <Setter Property="Background"> 
          <Setter.Value> 
... 
+0

Pourquoi «n'est-ce pas ce que vous voulez»? –

+1

Si je comprends l'autre réponse, un utilisateur devrait sélectionner un élément dans la zone de liste pour fermer tout ouvrir les expanseurs. Dans mon cas, un utilisateur peut être à la recherche d'un objet et ne pas encore avoir sélectionné quoi que ce soit et il ouvre des expandeurs pour effectuer une recherche visuelle. Nous voulons seulement un expander/groupe ouvert à tout moment pour économiser sur l'écran immobilier. J'ai essayé de lier IsExpanded à IsSelected, pour voir ce qui se passerait, mais rien ne s'est passé. Portsmouth

+0

Vous l'avez compris. Trouvé un blog sur le site MSDN. Est-ce que quelques modifications mineures au sugggestion du code et le mettre dans l'événement Expanded sur mon contrôle. L'astuce consiste à accéder à ItemsPresenter, puis à explorer les enfants dans l'extension de chaque élément du ItemsPresenter. Dans mon cas, les enfants étaient les ItemPresenter StackPanel, Border et l'Expander http://social.msdn.microsoft.com/forums/en-us/wpf/thread/2D228F89-CF9F-4CCA-9AC1-00AC70049F74 – Portsmouth

Répondre

1

Dans le modèle du ListBoxItem vous pouvez utiliser RadioButtons qui partagent le même groupe, lier leur IsChecked-IsSelected du ListBoxItem et retemplate comme Expander, de sorte que vous pouvez lier le IsExpanded à IsChecked sur le TemplatedParent.

Questions connexes