В чем разница между ControlTemplate
и a DataTemplate
в WPF?
Разница между шаблоном управления и DataTemplate в WPF
Ответ 1
Обычно элемент управления создается сам по себе и не отражает базовые данные. Например, Button
не будет привязан к бизнес-объекту - он там чисто, чтобы его можно было щелкнуть. A ContentControl
или ListBox
, однако, обычно отображаются так, что они могут представлять данные для пользователя.
A DataTemplate
, следовательно, используется для обеспечения визуальной структуры базовых данных, тогда как ControlTemplate
не имеет ничего общего с базовыми данными и просто обеспечивает визуальный макет для самого элемента управления.
A ControlTemplate
будет содержать только выражения TemplateBinding
, привязанные к свойствам самого элемента управления, а DataTemplate
будет содержать стандартные выражения Binding, привязанные к свойствам его DataContext
(бизнес/объект домена или модель представления).
Ответ 2
В основном a ControlTemplate
описывает, как отображать элемент управления, а DataTemplate
описывает, как отображать данные.
Например:
A Label
является элементом управления и будет включать ControlTemplate
, в котором говорится, что Label
должен отображаться с помощью Border
вокруг некоторого Контента (a DataTemplate
или другого элемента управления).
A Customer
class - это Data и будет отображаться с помощью DataTemplate
, который может сказать, чтобы отобразить тип Customer
как StackPanel
, содержащий два TextBlocks
, в которых указано Имя, а другое - номер телефона, Было бы полезно отметить, что все классы отображаются с помощью DataTemplates
, вы обычно будете использовать шаблон по умолчанию, который является TextBlock
с свойством Text
, установленным в результате метода Object ToString
.
Ответ 3
Troels Larsen имеет хорошее объяснение на форуме 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>
Ответ 4
ControlTemplate
: представляет стиль управления.
DataTemplate
: представляет стиль данных (как бы вы хотели показать свои данные).
Все элементы управления используют шаблон управления по умолчанию, который можно переопределить через свойство шаблона.
Например Button
template - это шаблон управления.
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");
}
}
Ответ 5
ControlTemplate
- Изменение внешнего вида элемента. Например, Button
может содержать изображение и текст
DataTemplate
- представление базовых данных с помощью элементов.
Ответ 6
ControlTemplate
ОПРЕДЕЛЯЕТ визуальный внешний вид, DataTemplate
ЗАМЕНЯЕТ визуальный внешний вид элемента данных.
Пример: я хочу показать кнопку от прямоугольника до круглой формы = > Шаблон управления.
И если у вас есть сложные объекты для элемента управления, он просто вызывает и показывает ToString()
, с DataTemplate
вы можете получать различные элементы и отображать и изменять их значения объекта данных.