2008-10-29 3 views
52

나는 목록 상자를 가지고 있고, 나는 그것을 위해 ItemTemplate을 다음 있습니다 :WPF 트리거

<DataTemplate x:Key="ScenarioItemTemplate"> 
    <Border Margin="5,0,5,0" 
      Background="#FF3C3B3B" 
      BorderBrush="#FF797878" 
      BorderThickness="2" 
      CornerRadius="5"> 
     <DockPanel> 
      <DockPanel DockPanel.Dock="Top" 
         Margin="0,2,0,0"> 
       <Button HorizontalAlignment="Left" 
         DockPanel.Dock="Left" 
         FontWeight="Heavy" 
         Foreground="White" /> 
       <Label Content="{Binding Path=Name}" 
         DockPanel.Dock="Left" 
         FontWeight="Heavy" 
         Foreground="white" /> 
       <Label HorizontalAlignment="Right" 
         Background="#FF3C3B3B" 
         Content="X" 
         DockPanel.Dock="Left" 
         FontWeight="Heavy" 
         Foreground="White" /> 
      </DockPanel> 
      <ContentControl Name="designerContent" 
          Visibility="Collapsed" 
          MinHeight="100" 
          Margin="2,0,2,2" 
          Content="{Binding Path=DesignerInstance}" 
          Background="#FF999898"> 
      </ContentControl> 
     </DockPanel> 
    </Border> 
</DataTemplate> 

당신이 붕괴에 ContentControl을가 가시성 설정 한 볼 수 있듯이.

나는 가시성이

은을 ListItem을 선택하면 "표시"로 설정되도록 트리거를 정의 할 필요가있다,하지만 난 그것을 알아낼 수 없습니다.

아이디어가 있으십니까?

업데이트 : 물론 DataTemplate을 복제하고 해당 목록 상자에 트리거를 추가하여 둘 중 하나를 사용할 수도 있지만이 코드를 복제하지 못하도록하고 싶습니다.

당신은 컨테이너합니다 (ListBoxItem의)를 선택하게되는 트리거 화재하도록 당신은 ContentControl 스타일을 지정할 수 있습니다

답변

98

: 또는

<ContentControl 
    x:Name="designerContent" 
    MinHeight="100" 
    Margin="2,0,2,2" 
    Content="{Binding Path=DesignerInstance}" 
    Background="#FF999898"> 
    <ContentControl.Style> 
     <Style TargetType="{x:Type ContentControl}"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      <Style.Triggers> 
       <DataTrigger 
         Binding="{Binding 
          RelativeSource={RelativeSource 
           Mode=FindAncestor, 
           AncestorType={x:Type ListBoxItem}}, 
           Path=IsSelected}" 
         Value="True"> 
        <Setter Property="Visibility" Value="Visible"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ContentControl.Style> 
</ContentControl> 

, 나는 템플릿 자체에 트리거를 추가 할 수 있습니다 생각하고 이름으로 컨트롤을 참조 . 내가 메모리에서 입력 및 작동합니다 가정하는 충분히이 기술을 모르겠지만, 이런 식으로 뭔가 :

<DataTemplate x:Key="ScenarioItemTemplate"> 
    <DataTemplate.Triggers> 
     <DataTrigger 
       Binding="{Binding 
        RelativeSource={RelativeSource 
         Mode=FindAncestor, 
         AncestorType={x:Type ListBoxItem}}, 
         Path=IsSelected}" 
       Value="True"> 
      <Setter 
       TargetName="designerContent" 
       Property="Visibility" 
       Value="Visible"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 

    ... 
</DataTemplate> 
+1

야! 정말 고맙습니다! 나는이 문제를 안고 있었지만 FindAncestor는 2 시간 동안 머리를 부딪 치면서 큰 고통을 해결할 수있었습니다! 다시 한번 감사드립니다. Jason –

+1

디자이너 콘텐츠 무엇입니까 ??? 선택한 listboxitem의 배경을 설정하려고합니다 (인라인 datatemplate 사용). 사용자가 항목을 선택할 때 배경이 파란색이되어서는 안되며 선택되지 않은 것과 같은 색을 가져야합니다. – Shimmy

+0

두 번째 예제의 DataTrigger Binding이 큰 도움이되었다고 덧붙이려고합니다. 감사! – NigelTufnel

3

@ 매트를 주셔서 감사합니다!

그냥 IsSelected == false도 트리거를 추가해야했습니다. 이제는 매력처럼 작동합니다!

<ContentControl.Style> 
<Style TargetType="{x:Type ContentControl}"> 
    <Setter Property="Visibility" Value="Collapsed"/> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"> 
      <Setter Property="Visibility" Value="Visible"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

+2

"틀린"경우 별도의 트리거가 없어야합니다. Visibility Setter가 Triggers 컬렉션 외부에서 처리합니다. –

+0

이상하다, 그럼 나는 여전히 틀린 일을해야만한다. – TimothyP

+8

하나의 값을 대상 자체의 기본값으로 지정하고 트리거를 사용하여 대체 값을 지정한다. –

관련 문제