WPFのControlTemplate
とDataTemplate
の違いは何ですか?
通常、コントロールは独自の目的でレンダリングされ、基になるデータを反映しません。たとえば、Button
はビジネスオブジェクトにバインドされません-クリックできるように純粋に存在します。ただし、通常、ContentControl
またはListBox
は、ユーザーにデータを提示できるように表示されます。
したがって、DataTemplate
は、基になるデータの視覚的な構造を提供するために使用されますが、ControlTemplate
は、基になるデータとは関係なく、単にコントロール自体の視覚的なレイアウトを提供します。
通常、ControlTemplate
には、コントロール自体のプロパティにバインドするTemplateBinding
式のみが含まれますが、DataTemplate
には、DataContext
(ビジネス/ドメインオブジェクトまたはビューモデル)のプロパティにバインドする標準のバインド式が含まれます。
非常に基本的に、ControlTemplate
はコントロールの表示方法を示し、DataTemplate
はデータの表示方法を示します。
例:
Label
はコントロールであり、一部のコンテンツ(ControlTemplate
または別のコントロール)の周りでLabel
を使用してBorder
を表示する必要があることを示すDataTemplate
が含まれます。
Customer
クラスはDataであり、DataTemplate
型を使用して表示されます。これは、Customer
型を、名前と電話番号を表示する2つのStackPanel
を含むTextBlocks
として表示できます。すべてのクラスはDataTemplates
を使用して表示されることに注意してください。通常は、オブジェクトのTextBlock
メソッドの結果に設定されたText
プロパティを持つToString
であるデフォルトテンプレートを使用します。
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>
(テンプレートは http://msdn.Microsoft.com/en-us/library/system.windows.controls.controltemplate.aspx および http://msdn.Microsoft。 com/en-us/library/system.windows.controls.contentcontrol.contenttemplate%28VS.95%29.aspx )
とにかく、ControlTemplateはボタン自体の外観を決定し、ContentTemplateはボタンのコンテンツの外観を決定します。そのため、コンテンツをデータクラスの1つにバインドし、必要に応じて表示することができます。
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");
}
}
ControlTemplate
-要素の外観を変更します。たとえば、Button
には画像とテキストを含めることができます
DataTemplate
-要素を使用して基になるデータを表します。
ControlTemplate
は視覚的な外観を定義し、DataTemplate
はデータ項目の視覚的な外観を置き換えます。
例:長方形から円形へのボタンを表示したい=>コントロールテンプレート。
コントロールに複雑なオブジェクトがある場合は、ToString()
を呼び出して表示するだけで、DataTemplate
を使用して、さまざまなメンバーを取得し、データオブジェクトの値を表示および変更できます。