WPF TemplateBinding 대 상대 소스 TemplatedParent


169

이 두 바인딩 의 차이점 은 무엇입니까?

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?


17
당신이 양방향 바인딩이 필요하면, 당신은 두 번째 옵션 사용 해
요아힘 Kerschbaumer

답변:


207

TemplateBinding은 완전히 다릅니다. MSDN 문서는 종종 소프트웨어 기능에 대한 단음절 SDE를 퀴즈로 풀어야하는 사람들이 작성하므로 뉘앙스가 옳지 않습니다.

템플릿 바인딩은 컨트롤 템플릿에 지정된 형식에 대해 컴파일 타임에 평가됩니다. 이렇게하면 컴파일 된 템플릿을 훨씬 빠르게 인스턴스화 할 수 있습니다. 템플릿 바인딩에서 이름을 바꾸면 컴파일러에서 플래그를 지정할 수 있습니다.

바인딩 마크 업은 런타임에 해결됩니다. 실행 속도는 느리지 만 바인딩은 템플릿에서 선언 한 유형에 표시되지 않는 속성 이름을 확인합니다. 더 느리게 말하면 바인딩 작업이 응용 프로그램의 CPU를 거의 사용하지 않기 때문에 그 종류의 상대 항목을 지적합니다. 컨트롤 템플릿을 고속으로 날려 버렸다면 알 수 있습니다.

실제로 바인딩을 두려워 할 수는 있지만 TemplateBinding을 사용하십시오.


18
따라서 주된 생각은 컴파일 시간과 런타임입니다. 런타임 중에 템플릿 바인딩을 변경하려고하면 TemplateBinding이 작동하지 않습니다. 권리 ?
PaN1C_Showt1Me

3
또한 TemplateBinding 대신 Binding을 사용하면 디자인 타임에 표시되는 내용에 영향을 줄 수 있습니다. 특정 구성에서 {Binding RelativeSource ...}를 사용하여 바인딩 된 속성은 디자이너에 표시되지 않지만 (런타임 동안 여전히 표시되지만) {TemplateBinding ...}을 사용하도록 전환하면 해당 속성이 평가됩니다. 디자인 타임 동안.
lfalin

향후 방문자에게 도움이 될 경우 추가 할 수있는 한 가지는 컴파일 할 때 TemplateBinding이 평가되므로 TemplateBinding을 사용하여 사용자 정의 된 연결된 속성에 바인딩 할 수 없다는 것입니다. 사용자 정의 첨부 속성의 경우 "{Binding RelativeSource = {RelativeSource TemplatedParent} ...}"
MNB

35

TemplateBinding- 일반 바인딩을 사용하는 것보다 더 제한적

  • 바인딩보다 효율적이지만 기능이 적습니다.
  • ControlTemplate의 비주얼 트리에서만 작동
  • Freezables의 속성으로는 작동하지 않습니다
  • ControlTemplate의 트리거 내에서 작동하지 않습니다
  • {TemplateBinding targetProperty}와 같이 속성을 설정하는 방법에 대한 바로 가기를 제공합니다 (예 : 자세한 설명 아님).

일반 바인딩-TemplateBinding의 제한이 없습니다.

  • 부모 속성 존중
  • 명시 적으로 설정된 값을 지우려면 대상 값을 재설정합니다
  • 예 : <Ellipse Fill = "{바인딩 RelativeSource = {RelativeSource TemplatedParent}, Path = Background}"/>

22

한 가지 더 – TemplateBindings는 값 변환을 허용하지 않습니다. 그들은 당신이 변환기를 전달할 수 없으며 int를 문자열로 자동 변환하지 않습니다 (예 : 바인딩의 경우 정상).


1
감사합니다 Miroslav, 이것은 내가 겪고있는 문제였습니다. TemplatedParent를 사용하여 전환하면 문제가 해결되었습니다.
MikeKulls

17

TemplateBinding은 TemplatedParent를 사용한 Binding의 약자이지만 Binding 클래스의 모든 기능을 노출하지는 않습니다. 예를 들어 TemplateBinding에서 Binding.Mode를 제어 할 수 없습니다.


1

TemplateBinding이 Freezable 형식 (브러시 개체 포함)을 지원하지 않는다고 생각했습니다. 문제를 해결하기 위해. 하나는 TemplatedParent를 사용할 수 있습니다


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.