DataTemplate和ControlTemplate联系与区别
---恢复内容开始---
正如标题中的两个拼接的单词所说,DataTemplate就是数据显示的模板,而ControlTemplate是控件自身的模板。(个人理解,错误请指出,谢谢)
我们看这二者在两类不同的控件中如何使用:
一:ItemsControl
我们可以利用ControlTemplate来设置控件外表,用DataTemplate来填充控件内容。
<Page.Resources> <DataTemplate x:Key="dataTemplate"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" Text="{Binding Name}"></TextBlock> <TextBlock Grid.Column="1" Text="{Binding Age}"></TextBlock> <TextBlock Grid.Column="2" Text="{Binding Sex}"></TextBlock> </Grid> </DataTemplate> </Page.Resources> <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> <ListBox x:Name="itemsControl" Width="300" Height="400" ItemsSource="{Binding Mode=OneWay}" ItemTemplate="{StaticResource dataTemplate}"> <ListBox.Template> <ControlTemplate> <Grid > <Grid.ColumnDefinitions> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> <ColumnDefinition></ColumnDefinition> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="auto"></RowDefinition> <RowDefinition></RowDefinition> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Grid.Column="0" FontSize="20" Text="姓名"></TextBlock> <TextBlock Grid.Row="0" Grid.Column="1" FontSize="20" Text="年龄"></TextBlock> <TextBlock Grid.Row="0" Grid.Column="2" FontSize="20" Text="性别"></TextBlock> <ItemsPresenter Grid.Row="1" Grid.ColumnSpan="3"> </ItemsPresenter> </Grid> </ControlTemplate> </ListBox.Template> </ListBox> <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Height="56" Margin="102,157,0,0" VerticalAlignment="Top" Width="190" Click="button_Click"/> </Grid>
对应的隐藏代码如下:
public class Info { public string Name { get; set; } = "佚名"; public int Age { get; set; } = 0; public string Sex { get; set; } = "不详"; } public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } private void button_Click(object sender, RoutedEventArgs e) { List<Info> list = new List<Info>(); list.Add(new Info()); list.Add(new Info { Age = 15, Name = "小莉", Sex = "女" }); list.Add(new Info { Age = 18, Name = "小桂子", Sex = "中" }); itemsControl.ItemsSource = list; } }
通过单击button,可以向列表控件中填充内容。
值得注意的是,列表表头在ControlTemplate中设置,而内标内容则是由DataTemplate通过数据绑定动态加载。
程序运行如下:
但是发现列表并没有按照表头的格式展开,这是因为ListBox中ListBoxItem中显示内容的宽度是自适应的。未来美观,我们作如下修改
设置ListBox的属性ItemContainerStyle如下:
<ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> </Style> </ListBox.ItemContainerStyle>
运行程序就发现如下显示了:
值得一提的是,我们在定义Info类的时候使用了C#6的新语法
public [类型] [变量名]{get;set;} = [初始化值];
好像跑题了。以上是ControlTemplate和DataTemplate在ItemsControl类型控件中的一个示例。而ContentControl类型控件中的用法也类似。唯一区别是在ContentTemplate中的ContentPresenter和ItemsPresenter之间。是哪种控件,就用哪种类型的Presenter。记住,设置了ContentTemplate,一定要设置ContentPresenter或ItemsPresenter,否则数
据不显示。
来点官方的
public sealed class ControlTemplate : Windows.UI.Xaml.FrameworkTemplate public class DataTemplate : Windows.UI.Xaml.FrameworkTemplate public class FrameworkTemplate : Windows.UI.Xaml.DependencyObject Windows.UI.Xaml 的成员 摘要: 创建元素的元素树。FrameworkTemplate 是那些具有特定模板化行为(包括 ControlTemplate 和 DataTemplate)的类的基类。
通过上面的,你应该已经看出他们的共同点了。
至于核心的,在深入的。我也就不懂了。。该请教周家安,林政这些.net界的大牛了。向前辈致敬!