Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between Templates

What is the difference between

  • ControlTemplate
  • DataTemplate
  • HierarchalDataTemplate
  • ItemTemplate
like image 732
user1688603 Avatar asked Sep 22 '12 08:09

user1688603


2 Answers

Control Template

A ControlTemplate specifies the visual structure and visual behavior of a control. You can customize the appearance of a control by giving it a new ControlTemplate. When you create a ControlTemplate, you replace the appearance of an existing control without changing its functionality. For example, you can make the buttons in your application round rather than the default square shape, but the button will still raise the Click event.

An Example of ControlTemplate would be

Creating a Button

<Button Style="{StaticResource newTemplate}" 
        Background="Navy" 
        Foreground="White" 
        FontSize="14"
        Content="Button1"/>

ControlTemplate for Button

<Style TargetType="Button" x:Key="newTemplate"> 
      <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border x:Name="RootElement">
                <!--Create the SolidColorBrush for the Background 
                as an object elemment and give it a name so 
                it can be referred to elsewhere in the control template.-->
                    <Border.Background>
                        <SolidColorBrush x:Name="BorderBrush" Color="Black"/>
                    </Border.Background>
                    <!--Create a border that has a different color by adding smaller grid.
                    The background of this grid is specificied by the button's Background
                    property.-->
                    <Grid Margin="4" Background="{TemplateBinding Background}">
                    <!--Use a ContentPresenter to display the Content of
                    the Button.-->
                        <ContentPresenter
                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                        Margin="4,5,4,4" />
                    </Grid>
                </Border>
            </ControlTemplate>      
        </Setter.Value>
    </Setter>
</Style>

More about ControlTemplate

Data Templates

Data Template are a similar concept as Control Templates. They give you a very flexible and powerful solution to replace the visual appearance of a data item in a control like ListBox, ComboBox or ListView. WPF controls have built-in functionality to support the customization of data presentation.

An Example for the DataTemplate would be

<!-- Without DataTemplate -->
<ListBox ItemsSource="{Binding}" /> 

<!-- With DataTemplate -->
<ListBox ItemsSource="{Binding}" BorderBrush="Transparent" 
         Grid.IsSharedSizeScope="True"
         HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="4">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Key" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Name}" FontWeight="Bold"  />
                <TextBox Grid.Column="1" Text="{Binding Value }" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

More about DataTemplates and Triggers

Item Templates

You use the ItemTemplate to specify the visualization of the data objects. If your ItemsControl is bound to a collection object and you do not provide specific display instructions using a DataTemplate, the resulting UI of each item is a string representation of each object in the underlying collection.

An Example for Item Template would be

<ListBox Margin="10" Name="lvDataBinding">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <WrapPanel>
                <TextBlock Text="Name: " />
                <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                <TextBlock Text=", " />
                <TextBlock Text="Age: " />
                <TextBlock Text="{Binding Age}" FontWeight="Bold" />
                <TextBlock Text=" (" />
                <TextBlock Text="{Binding Mail}" TextDecorations="Underline" Foreground="Blue" Cursor="Hand" />
                <TextBlock Text=")" />
            </WrapPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

When you set an ItemTemplate on an ItemsControl, the UI is generated as follows (using the ListBox as an example):

  1. During content generation, the ItemsPanel initiates a request for the ItemContainerGenerator to create a container for each data item. For ListBox, the container is a ListBoxItem. The generator calls back into the ItemsControl to prepare the container.

  2. Part of the preparation involves the copying of the ItemTemplate of the ListBox to be the ContentTemplate of the ListBoxItem.

  3. Similar to all ContentControl types, the ControlTemplate of a ListBoxItem contains a ContentPresenter. When the template is applied, it creates a ContentPresenter whose ContentTemplate is bound to the ContentTemplate of the ListBoxItem.

  4. Finally, the ContentPresenter applies that ContentTemplate to itself, and that creates the UI.

If you have more than one DataTemplate defined and you want to supply logic to programmatically choose and apply a DataTemplate, use the ItemTemplateSelector property.

The ItemsControl provides great flexibility for visual customization and provides many styling and templating properties. Use the ItemContainerStyle property or the ItemContainerStyleSelector property to set a style to affect the appearance of the elements that contain the data items. For example, for ListBox, the generated containers are ListBoxItem controls; for ComboBox, they are ComboBoxItem controls. To affect the layout of the items, use the ItemsPanel property. If you are using grouping on your control, you can use the GroupStyle or GroupStyleSelector property.

For more information, see Data Templating Overview.

like image 198
Mohit S Avatar answered Sep 28 '22 20:09

Mohit S


  1. ControlTemplaes defines the "look" and the "behavour" of a control. A button is rectangular by default. A ListBox has a white background by default. These are all defineed by Control's ControlTemple.

  2. A DataTemplae helps a Control with Layout of Data that it holds. If a list of Users are added to listbox and you would like UserName to show up before UserPassword then you will define this inside a DataTemples. DataTemples is assigned to the ItemTemplate (4) Property of the ListBox.

  3. HierarchalDataTemplte is same as DataTemples except that it deal with Hierarchal Data Source. It is commonlly used with TreeView Control.

like image 40
Faisal Avatar answered Sep 28 '22 19:09

Faisal