development

WPF에서 컨트롤 템플릿과 DataTemplate의 차이점

big-blog 2020. 5. 12. 19:03
반응형

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디스플레이로 말할 수있는 CustomerA와 타입을 StackPanel포함하는 두 개의 TextBlocks전화 번호를 표시하는 명칭을 도시 한 다른. 그것은 모든 클래스를 사용하여 표시되는 점에 유의하는 것이 도움이 될 수도 DataTemplates, 그냥 보통 인 기본 템플릿 사용 TextBlockText개체의 결과에 대한 속성 설정 ToString방법.


Troels LarsenMSDN 포럼 에 대한 좋은 설명이 있습니다.

<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.aspxhttp://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.

참고URL : https://stackoverflow.com/questions/1340108/difference-between-control-template-and-datatemplate-in-wpf

반응형