Difference between Control Template and DataTemplate in WPF

WpfDatatemplateControltemplate

Wpf Problem Overview


What is difference between a ControlTemplate and a DataTemplate in WPF?

Wpf Solutions


Solution 1 - Wpf

Typically a control is rendered for its own sake, and doesn't reflect underlying data. For example, a Button wouldn't be bound to a business object - it's there purely so it can be clicked on. A ContentControl or ListBox, however, generally appear so that they can present data for the user.

A DataTemplate, therefore, is used to provide visual structure for underlying data, while a ControlTemplate has nothing to do with underlying data and simply provides visual layout for the control itself.

A ControlTemplate will generally only contain TemplateBinding expressions, binding back to the properties on the control itself, while a DataTemplate will contain standard Binding expressions, binding to the properties of its DataContext (the business/domain object or view model).

Solution 2 - Wpf

Very basically a ControlTemplate describes how to display a Control while a DataTemplate describes how to display Data.

For example:

A Label is a control and will include a ControlTemplate which says the Label should be displayed using a Border around some Content (a DataTemplate or another Control).

A Customer class is Data and will be displayed using a DataTemplate which could say to display the Customer type as a StackPanel containing two TextBlocks one showing the Name and the other displaying the phone number. It might be helpful to note that all classes are displayed using DataTemplates, you will just usually use the default template which is a TextBlock with the Text property set to the result of the Object's ToString method.

Solution 3 - Wpf

Troels Larsen has a good explanation on MSDN forum

> xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" > xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > Title="MainWindow" Height="350" Width="525"> > > > > > 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"/> > Margin="2,3,0,0" > VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" > Data="M3.2,7.5 L7.5,7.5 L7.5,3.5"/> > 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"/> > 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"/> > Margin="1,1,1,1" > VerticalAlignment="Stretch" Stretch="Fill" Stroke="#FFFFFFFF" > Data="M1.5,6.5 L1.5,1 L6.5,1.5"/> > > > > > > > > VerticalAlignment="Center"/> > > > > >

Solution 4 - Wpf

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

Solution 5 - Wpf

ControlTemplate - Changing the appearance of element. For example Button can contain image and text

DataTemplate - Representing the underlying data using the elements.

Solution 6 - Wpf

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.

Solution 7 - Wpf

All of the above answers are great but there is a key difference that was missed. That helps make better decisions about when to use what. It is ItemTemplate property:

  • DataTemplate is used for elements that provide ItemTemplate property for you to replace its items' content using DataTemplates you define previously according to bound data through a selector that you provide.

  • But if your control does not provide this luxury for you then you still can use a ContentView that can display its content from predefined ControlTemplate. Interestingly, you can change the ControlTemplate property of your ContentView at runtime. One more thing to note that unlike controls with ItemTemplate property, you cannot have a TemplateSelector for this (ContentView) control. However, you still can create triggers to change the ControlTemplate at runtime.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFirozView Question on Stackoverflow
Solution 1 - WpfMatt HamiltonView Answer on Stackoverflow
Solution 2 - WpfBryan AndersonView Answer on Stackoverflow
Solution 3 - Wpfonmyway133View Answer on Stackoverflow
Solution 4 - Wpfsayed saadView Answer on Stackoverflow
Solution 5 - WpfSyedView Answer on Stackoverflow
Solution 6 - WpfnihnihView Answer on Stackoverflow
Solution 7 - WpfAshiView Answer on Stackoverflow