2016-11-09 1 views
0

Setter를 사용하여 DataTrigger 내부에 확장기 IsExpanded 속성을 설정하려고합니다. 내가 "자기"또는 같은 몇 가지 키워드를 원요소 자체의 속성을 설정할 수 있습니까?

TargetName="myExpander" 

같은 코드를 작성할 때

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Expander x:Name="myExpander" /> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding ElementName=myExpander, Path=IsKeyboardFocusWithin}" Value="False"> 
      <Setter TargetName="Self" Property="IsExpanded" Value="False" /> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

문제는 "." - Setter 타겟을 부모의 엘리먼트와 연관시켜 그것을 찾는 것. (후자는 일하는 것이 비록) 나는 SourceName보다는 DataTriggerTrigger을 사용

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Expander x:Name="myExpander" /> 
     <DataTemplate.Triggers> 
      <Trigger SourceName="myExpander" Property="IsKeyboardFocusWithin" Value="False"> 
       <Setter TargetName="myExpander" Property="IsExpanded" Value="False" /> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

참고 :

+0

TargetName을 생략 할 수 있습니다. 목표는 자기를 의미하지 않습니다. –

+0

TargetName을 생략하면 컴파일 오류가 발생합니다. 그것은 템플릿 속성 'IsExpanded'를 찾을 수 없다고 말합니다. –

+0

트리거는 한 가지이며, '확장기'는 다른 것입니다. 그것들은 * 사용하기 쉬운 관계에 있지 않습니다 (그것은 '자기'또는 '상대 소스'가 아닙니다). 그리고 참조 요소에 이름을 사용하는 것이 좋습니다. 이름을 가지고있는 문제는 무엇입니까? – Sinatr

답변

1

나는 당신이 찾고있는 것은이 생각합니다. Setter의 경우 확장자의 속성을 설정하려면 TargetName="myExpander"을 설정해야합니다. TargetName을 지정하지 않으면 설정자는 DataTemplate 자체에서 속성을 설정하려고 시도합니다.

적어도 이론적 인 해결책입니다. 실제로는 IsKeyboardFocusWithin을 기반으로하는 트리거가 달성하려는 노력에 좋은 선택이 아니기 때문에 적어도 (또는 적어도 예상대로) 작동하지 않습니다. 더 나은 선택은 LostFocus 이벤트를 구독하는 것입니다.

관련 문제