ControlTemplate을 정의할때 부모 컨트롤의 속성을 받아들이기 위해 TemplateBinding을 사용한다. 즉, ControlTemplate을 버튼 내부에 정의한다고 가정했을때 해당 ControlTemplate 내의 Rectangle 요소와 버튼의 Width를 동일하게 맞추고 싶다면 Rectangle 요소의 Width 속성에 버튼의 Width 속성을 바인딩 시켜야 하며 이때 TemplateBinding을 이용해 간편하게 바인딩 시킬수 있다.
<Button.Template>
<ControlTemplate>
......
<Rectangle Width ="{TemplateBinding Width}" ...
....
</ControlTempalte>
</Button.Template/>
TemplateBinding은 Binding 과 그 역할이 동일하다. 따라서 다음의 코드도 똑같은 효과를 볼수 있다.
<Rectangle Width ="{Binding Width,RelativeSource={RelativeSource TemplatedParent}" ...
그렇다면 둘 중 어느것을 사용하는 것이 옳을까? 기본적으로 TemplateBinding이 Binding에 비해 훨씬 가볍다. 하지만 TemplateBinding과 Binding은 다음의 2가지 측면에서 확연히 다르다.
첫번째, TemplateBinding은 양방향 바인딩을 지원하지 않는다. 따라서 TwoWay 같은 바인딩 클래스의 기능은 지원하지 않는다.
두번째, TemplateBinding은 Freezable 클래스에서 상속된 클래스 속성과의 바인딩을 지원하지 않는다. 따라서 Brush 나 Pen 등에 바인딩하기 위해선 TempalteBinding이 아닌 Binding을 이용해야 한다.
<Button.Template>
<ControlTemplate>
......
<Rectangle Width ="{TemplateBinding Width}"
Fill ="{Binding Background,RelativeSource={RelativeSource TemplatedParent}" />
</ControlTempalte>
</Button.Template/>
따라서 ControlTemplate 을 정의할땐 가벼운 TempateBinding을 이용하되, Rectangle의 Fill이나 Background, Foreground 같은 Brush 타입의 속성, 즉 Freezable 을 상속받는 속성에는 Binding을 이용해야 할 것이다.
'Programming > WPF' 카테고리의 다른 글
How to bind multiple values to a single WPF TextBlock? (0) | 2015.02.05 |
---|---|
Label, TextBlock, TextBox (0) | 2015.02.05 |
MVVM 디자인 패턴을 사용한 WPF 응용 프로그램 (0) | 2015.02.04 |
WPF와 Silverlight 에서 TextBox 의 한글 입력을 막는 방법 (0) | 2015.02.04 |
다른 스레드가 이 개체를 소유하고 있어 호출한 스레드가 해당 개체에 액세스할 수 없습니다 (0) | 2015.02.04 |