답변:
일반적으로 컨트롤은 자체적으로 렌더링되며 기본 데이터를 반영하지 않습니다. 예를 들어, Button
비즈니스 개체에 바인딩되지 않습니다. 순수하게 존재하므로 클릭 할 수 있습니다. ContentControl
하거나 ListBox
하지만, 보통은 사용자에게 데이터를 표시 할 수 있도록 표시.
DataTemplate
따라서 A 는 기본 데이터에 대한 시각적 구조를 제공하는 데 사용되는 반면 ControlTemplate
기본 데이터와는 아무런 관련이 없으며 컨트롤 자체에 대한 시각적 레이아웃을 제공합니다.
A ControlTemplate
는 일반적으로 TemplateBinding
컨트롤 자체의 속성에 바인딩되는 식만 포함하고 A 는 비즈니스 / 도메인 개체 또는 뷰 모델 DataTemplate
의 속성에 바인딩하는 표준 바인딩 식을 포함합니다 DataContext
.
기본적으로는 ControlTemplate
컨트롤을 표시하는 DataTemplate
방법을 설명하고 데이터를 표시하는 방법을 설명합니다.
예를 들면 다음과 같습니다.
A는 Label
제어이며이 포함됩니다 ControlTemplate
라고하는 Label
을 사용하여 표시해야합니다 Border
일부 콘텐츠 (A 주위에 DataTemplate
또는 다른 제어).
Customer
클래스 데이터이고하여 표시하는 DataTemplate
디스플레이로 말할 수있는 Customer
A와 타입을 StackPanel
포함하는 두 개의 TextBlocks
전화 번호를 표시하는 명칭을 도시 한 다른. 그것은 모든 클래스를 사용하여 표시되는 점에 유의하는 것이 도움이 될 수도 DataTemplates
, 그냥 보통 인 기본 템플릿 사용 TextBlock
와 Text
개체의 결과에 대한 속성 설정 ToString
방법.
Troels Larsen 은 MSDN 포럼 에 대한 좋은 설명이 있습니다.
<Window x:Class="WpfApplication7.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <DataTemplate x:Key="ButtonContentTemplate"> <StackPanel Orientation="Horizontal"> <Grid Height="8" Width="8"> <Path HorizontalAlignment="Stretch" Margin="0,0,1.8,1.8" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FF000000" Data="M0.5,5.7 L0.5,0.5 L5.7,0.5"/> <Path HorizontalAlignment="Stretch" Margin="2,3,0,0" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" Data="M3.2,7.5 L7.5,7.5 L7.5,3.5"/> <Path HorizontalAlignment="Stretch" Margin="1.2,1.4,0.7,0.7" VerticalAlignment="Stretch" Fill="#FFFFFFFF" Stretch="Fill" Stroke="#FF000000" Data="M2.5,2.5 L7.5,7.5"/> <Path HorizontalAlignment="Stretch" Margin="1.7,2.0,1,1" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FF000000" Data="M3,7.5 L7.5,7.5 L7.5,3.5"/> <Path HorizontalAlignment="Stretch" Margin="1,1,1,1" VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" Data="M1.5,6.5 L1.5,1 L6.5,1.5"/> </Grid> <ContentPresenter Content="{Binding}"/> </StackPanel> </DataTemplate> <ControlTemplate TargetType="Button" x:Key="ButtonControlTemplate"> <Grid> <Ellipse Fill="{TemplateBinding Background}"/> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> </ControlTemplate> </Window.Resources> <StackPanel> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="1"/> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="2"/> <Button Template="{StaticResource ButtonControlTemplate}" ContentTemplate="{StaticResource ButtonContentTemplate}" Content="3"/> </StackPanel> </Window>
(템플릿은 http://msdn.microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx 및 http://msdn.microsoft.com/en-us/library/system.windows 에서 명백히 도난당했습니다 . .controls.contentcontrol.contenttemplate % 28VS.95 % 29.aspx 각각)
어쨌든 ControlTemplate은 버튼 자체의 모양을 결정하는 반면 ContentTemplate은 버튼의 내용 모양을 결정합니다. 따라서 컨텐츠를 데이터 클래스 중 하나에 바인딩하고 원하는대로 표시 할 수 있습니다.
ControlTemplate
: 컨트롤 스타일을 나타냅니다.
DataTemplate
: 데이터 스타일을 나타냅니다 (데이터를 어떻게 표시 하시겠습니까?).
모든 컨트롤은 템플릿 속성을 통해 재정의 할 수있는 기본 컨트롤 템플릿을 사용하고 있습니다.
예를 들어
Button
템플릿은 컨트롤 템플릿입니다.
Button
콘텐츠 템플릿은 데이터 템플릿입니다
<Button VerticalAlignment="Top" >
<Button.Template>
<ControlTemplate >
<Grid>
<Rectangle Fill="Blue" RadiusX="20" RadiusY="20"/>
<Ellipse Fill="Red" />
<ContentPresenter Content="{Binding}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="50">
<TextBlock Text="Name" Margin="5"/>
<TextBox Text="{Binding UserName, Mode=TwoWay}" Margin="5" Width="100"/>
<Button Content="Show Name" Click="OnClickShowName" />
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
public String UserName
{
get { return userName; }
set
{
userName = value;
this.NotifyPropertyChanged("UserName");
}
}
위의 모든 대답은 훌륭하지만 놓친 주요 차이점이 있습니다. 그러면 언제 무엇을 사용해야하는지에 대한 더 나은 결정을 내릴 수 있습니다. 그것은이다 ItemTemplate
특성 :
DataTemplate은 사용자가 제공 한 선택기를 통해 바인딩 된 데이터에 따라 미리 정의한을 사용하여 항목의 내용을 바꿀 수 있도록 ItemTemplate 속성 을 제공하는 요소에 사용됩니다 DataTemplate
.
그러나 컨트롤에서이 고급 기능을 제공하지 않으면ContentView
미리 정의 된 콘텐츠를 표시 할 수있는를 사용할 수 있습니다 ControlTemplate
. 흥미롭게도 런타임에 ControlTemplate
속성을 변경할 수 있습니다 ContentView
. ItemTemplate
속성이있는 컨트롤과 달리이 TemplateSelector
(ContentView) 컨트롤을 가질 수 없습니다 . 그러나 여전히 ControlTemplate
런타임시 변경 트리거를 작성할 수 있습니다 .