Разница между шаблоном управления и DataTemplate в WPF



в чем разница между a ControlTemplate и DataTemplate в WPF?

900   6  

6 ответов:

обычно элемент управления отображается сам по себе и не отражает базовые данные. Например,Button не будет привязан к бизнес-объекту - он там чисто, чтобы его можно было щелкнуть. А ContentControl или ListBox, однако, как правило, появляются, так что они могут представить данные для пользователя.

A DataTemplate, следовательно, используется для обеспечения визуальной структуры для базовых данных, в то время как ControlTemplate не имеет ничего общего с исходными данными и просто обеспечивает визуальный макет для взять себя.

A ControlTemplate обычно содержит только TemplateBinding выражения, привязка к свойствам на самом элементе управления, в то время как DataTemplate будет содержать стандартные выражения привязки, привязки к свойствам его DataContext (бизнес-объект / домен или модель представления).

очень в основном a ControlTemplate описывает, как отображать элемент управления в то время как DataTemplate описывает, как отображать данные.

например:

A Label контроль и будет включать в себя ControlTemplate Что говорит Label должно отображаться с помощью Border вокруг некоторого содержания (a DataTemplate или другой элемент управления).

A Customer класс-это данные и будет отображаться с помощью DataTemplate который мог бы сказать, чтобы отобразить Customer тип как StackPanel содержащий два TextBlocks один показывает имя, а другой-номер телефона. Это может быть полезно отметить, что все классы отображаются с помощью DataTemplates, вы просто обычно используете шаблон по умолчанию, который является TextBlock С Text свойство, установленное в результате объекта ToString метод.

У Троэльса Ларсена есть хорошее объяснение на форум 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>

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

ControlTemplate - изменение внешнего вида элемента. Например Button может содержать изображение и текст

DataTemplate - представление базовых данных с использованием элементов.

ControlTemplate определяет внешний вид, DataTemplate заменяет внешний вид элемента данных.

пример: я хочу показать кнопку от прямоугольной формы до круга => шаблон управления.

и если у вас есть сложные объекты управления, он просто звонит и показывает ToString() С DataTemplate вы можете получить различные элементы и отображать и изменять их значения объекта данных.

Comments

    Ничего не найдено.