2010-05-28 3 views
1

확장기가있는 템플릿 그룹화 된 목록 상자가있는 UserControl이 있고 언제든지 하나의 확장기 만 열려 있어야합니다. 사이트를 탐색했지만 IsExpanded를 IsSelected에 바인딩하는 것 외에는 아무것도 찾지 못했습니다. 이는 내가 원하는 것만은 아닙니다.WPF - 그룹화 된 목록 상자에서 한 번에 하나의 확장기 만 열려 있어야합니다.

Expanded 이벤트를 통해 루프를 반복하고 Expanded 이벤트에서 전달 된 확장 이벤트가 아닌 모든 이벤트를 닫는 Expanded 이벤트에 일부 코드를 추가하려고합니다. 나는 그 (것)들에 얻는 방법을 파악하는 것을 보일 수 없다. ListBox.Items.Groups를 시도했지만 ListBox.ItemContainerGenerator.ContainerFromItem (또는 Index)을 시도했지만 아무 것도 돌아 오지 않았습니다.

감사

여기에 현재의 마크 업입니다 :

<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

'왜 당신이 원하는가?' –

+1

다른 답변을 이해하면 사용자는 목록 상자에서 항목을 선택하여 확장기를 모두 닫아야합니다. 내 경우에는 사용자가 항목을 찾고 실제로 아무것도 선택하지 않았으며 시각적 검색을 위해 확장기를 열었습니다. 우리는 언제든지 열리는 하나의 확장기/그룹 만 화면의 실제 공간에 저장하기를 원합니다. 나는 IsSelected에 IsExpanded를 바인딩하여 어떤 일이 일어나는지 보았지만 아무 일도 일어나지 않았다. Portsmouth

+0

알아 냈습니다. MSDN 사이트에서 블로그를 발견했습니다. 코드 sugggestion에 약간의 수정을 가하고 내 컨트롤의 Expanded 이벤트에 넣었습니다. 트릭은 ItemsPresenter로 이동 한 다음 Children을 통해 ItemsPresenter의 각 항목의 확장자까지 드릴 다운하는 것입니다. 제 경우에는 아이들이 ItemPresenter StackPanel, Border 및 Expander였습니다. http://social.msdn.microsoft.com/forums/en-us/wpf/thread/2D228F89-CF9F-4CCA-9AC1-00AC70049F74 – Portsmouth

답변

1

ListBoxItem의의 템플릿에서 당신이 자신의 IsCheckedListBoxItemIsSelected에 바인딩 같은 그룹을 공유 RadioButtons를 사용하고 확장기로 retemplate 수는, 따라서 IsExpandedTemplatedParentIsChecked에 바인딩 할 수 있습니다.