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


답변:


267

일반적으로 컨트롤은 자체적으로 렌더링되며 기본 데이터를 반영하지 않습니다. 예를 들어, Button비즈니스 개체에 바인딩되지 않습니다. 순수하게 존재하므로 클릭 할 수 있습니다. ContentControl하거나 ListBox하지만, 보통은 사용자에게 데이터를 표시 할 수 있도록 표시.

DataTemplate따라서 A 는 기본 데이터에 대한 시각적 구조를 제공하는 데 사용되는 반면 ControlTemplate기본 데이터와는 아무런 관련이 없으며 컨트롤 자체에 대한 시각적 레이아웃을 제공합니다.

A ControlTemplate는 일반적으로 TemplateBinding컨트롤 자체의 속성에 바인딩되는 식만 포함하고 A 는 비즈니스 / 도메인 개체 또는 뷰 모델 DataTemplate의 속성에 바인딩하는 표준 바인딩 식을 포함합니다 DataContext.


21
말이 되나요? 나는 기술적 인 것보다는 철학적 차이점을 설명하려고 노력하고있는 것 같습니다.
매트 해밀턴

110

기본적으로는 ControlTemplate컨트롤을 표시하는 DataTemplate방법을 설명하고 데이터를 표시하는 방법을 설명합니다.

예를 들면 다음과 같습니다.

A는 Label제어이며이 포함됩니다 ControlTemplate라고하는 Label을 사용하여 표시해야합니다 Border일부 콘텐츠 (A 주위에 DataTemplate또는 다른 제어).

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


설명의 단순성에 투표했습니다. 매우 감사.
피트 Magsig

31

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 각각)

어쨌든 ControlTemplate은 버튼 자체의 모양을 결정하는 반면 ContentTemplate은 버튼의 내용 모양을 결정합니다. 따라서 컨텐츠를 데이터 클래스 중 하나에 바인딩하고 원하는대로 표시 할 수 있습니다.


19

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");
    }
}

7

ControlTemplate-요소의 모양을 변경합니다. 예를 들어 Button이미지와 텍스트를 포함 할 수 있습니다

DataTemplate -요소를 사용하여 기본 데이터를 나타냅니다.


1

ControlTemplate시각적 외관을 정의 DataTemplate하는 데이터 항목의 외관을 대체한다.

예 : 직사각형에서 원형으로 버튼을 표시하고 싶습니다 => 컨트롤 템플릿.

당신이 컨트롤에 복잡한 개체가 있다면, 그냥 전화와 쇼 ToString()와 함께, DataTemplate다양한 회원들과 디스플레이를 얻을 수 및 데이터 객체들의 값을 변경할 수 있습니다.


0

위의 모든 대답은 훌륭하지만 놓친 주요 차이점이 있습니다. 그러면 언제 무엇을 사용해야하는지에 대한 더 나은 결정을 내릴 수 있습니다. 그것은이다 ItemTemplate특성 :

  • DataTemplate은 사용자가 제공 한 선택기를 통해 바인딩 된 데이터에 따라 미리 정의한을 사용하여 항목의 내용을 바꿀 수 있도록 ItemTemplate 속성제공하는 요소에 사용됩니다 DataTemplate.

  • 그러나 컨트롤에서이 고급 기능을 제공하지 않으면ContentView 미리 정의 된 콘텐츠를 표시 할 수있는를 사용할 수 있습니다 ControlTemplate. 흥미롭게도 런타임에 ControlTemplate속성을 변경할 수 있습니다 ContentView. ItemTemplate속성이있는 컨트롤과 달리이 TemplateSelector(ContentView) 컨트롤을 가질 수 없습니다 . 그러나 여전히 ControlTemplate런타임시 변경 트리거를 작성할 수 있습니다 .

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