WPF에서 컨트롤 템플릿과 DataTemplate의 차이점
WPF에서 a ControlTemplate
와 a의 차이점은 무엇입니까 DataTemplate
?
일반적으로 컨트롤은 자체적으로 렌더링되며 기본 데이터를 반영하지 않습니다. 예를 들어, 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 각각)
Anyway, the ControlTemplate decides how the Button itself looks, while the ContentTemplate decides how the Content of the button looks. So you could bind the content to one of you data classes and have it present itself however you wanted it.
ControlTemplate
: Represents control style.
DataTemplate
: Represents data style(How would you like to show your data).
All controls are using default control template that you can override through template property.
For example
Button
template is a control template. Button
content template is a data template
<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");
}
}
ControlTemplate
- Changing the appearance of element. For example Button
can contain image and text
DataTemplate
- Representing the underlying data using the elements.
ControlTemplate
DEFINES the visual appearance, DataTemplate
REPLACES the visual appearance of a data item.
Example: I want to show a button from rectangular to circle form => Control Template.
And if you have complex objects to the control, it just calls and shows ToString()
, with DataTemplate
you can get various members and display and change their values of the data object.
'development' 카테고리의 다른 글
"git diff"에서 파일을 제외하고 싶습니다 (0) | 2020.05.12 |
---|---|
자체 언어로 컴파일러 작성 (0) | 2020.05.12 |
Rails 마이그레이션 : 열의 기본 설정 실행 취소 (0) | 2020.05.12 |
규칙 엔진을 구현하는 방법? (0) | 2020.05.12 |
PHP 경고 : POST 컨텐츠 길이 (8978294 바이트)가 0 행의 알 수 없음의 8388608 바이트 제한을 초과합니다. (0) | 2020.05.12 |