引言

WPF 数据模板化模型呢定义数据的代表形式提供了酷怪的油滑。WPF
控件有支撑自定义数据表示形式之放功能。首先介绍下怎样定义Datatemplate,然后再度介绍其他数模板化功能,例如根据从定义逻辑选择模板与支持显得分层数据。

 

有关 WPF 样式与模板模型的介绍(例如如何运用
Style.aspx)
来安控件的性能),请参见体制设置以及模板化.aspx)主题。

此外,了解Resources也颇重大,它实在是关于而对象(例如,Style.aspx)

DataTemplate.aspx))成为可选用对象的内容。有关资源的还多信息,请参见XAML
资源.aspx)。

 

数码模板基础

本节带有下列子节。

 

  • 没有 DataTemplate
  • 概念简单 DataTemplate
  • 以 DataTemplate 创建为资源
  • DataType 属性

主界面:

<Window x:Class="SDKSample.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:SDKSample"
  Title="Introduction to Data Templating Sample">
  <Window.Resources>
    <local:Tasks x:Key="myTodoList"/>


...



</Window.Resources>
  <StackPanel>
    <TextBlock Name="blah" FontSize="20" Text="My Task List:"/>
    <ListBox Width="400" Margin="10"
             ItemsSource="{Binding Source={StaticResource myTodoList}}"/>


...


  </StackPanel>
</Window>

 

没有 DataTemplate

万一没
DataTemplate.aspx),我们的
ListBox.aspx)
当前所有如下外观:

 

图片 1

 

由尚未其他特定说明,ListBox.aspx)
在尝试显示集合中之对象时,默认情况下会调用 ToString。因此,如果 Task
对象还写 ToString 方法,则
ListBox.aspx)
显示基础集合中每个来自对象的字符串表示形式。

像,如果 Task 类以这种艺术再次写 ToString 方法,其中 name 是 TaskName
属性的字段:

 

public override string ToString()
{
    return name.ToString();
}

可是这么特别无活,有多范围。另外,如果如绑定XML的数码,无法还写TOString方法。

 

概念简单 DataTemplate

然做的一样种植方式是将
ListBox.aspx)

ItemTemplate.aspx)
属性设置也
DataTemplate.aspx)。
DataTemplate.aspx)
中指定的情变成数据对象的可视结构。
以下DataTemplate.aspx)
相当简单。 我们要给出底认证是:每起显示为
StackPanel.aspx)
中的老三独
TextBlock.aspx)
元素。 每个
TextBlock.aspx)
元素绑定到 Task 类的一个性质。

 

<ListBox Width="400" Margin="10"
         ItemsSource="{Binding Source={StaticResource myTodoList}}">
   <ListBox.ItemTemplate>
     <DataTemplate>
       <StackPanel>
         <TextBlock Text="{Binding Path=TaskName}" />
         <TextBlock Text="{Binding Path=Description}"/>
         <TextBlock Text="{Binding Path=Priority}"/>
       </StackPanel>
     </DataTemplate>
   </ListBox.ItemTemplate>
 </ListBox>

 

以身作则的底蕴数据是 CLR 对象的一个集结。如果只要绑定到 XML
数据,则基本概念相同,但是语法有轻微差异。 例如,不是叫
Path=TaskName,而是将
XPath.aspx)
设置也@TaskName(如果 TaskName 是 XML 节点的表征)。

图片 2

 

用 DataTemplate 创建为资源

 

<Window.Resources>


...


<DataTemplate x:Key="myTaskTemplate">
  <StackPanel>
    <TextBlock Text="{Binding Path=TaskName}" />
    <TextBlock Text="{Binding Path=Description}"/>
    <TextBlock Text="{Binding Path=Priority}"/>
  </StackPanel>
</DataTemplate>


...


</Window.Resources>

 

兹,您得将 myTaskTemplate 用作资源,如下面的示范所示:

 

<ListBox Width="400" Margin="10"
         ItemsSource="{Binding Source={StaticResource myTodoList}}"
         ItemTemplate="{StaticResource myTaskTemplate}"/>

 

以 myTaskTemplate 是资源,所以你现在可当所有用
DataTemplate.aspx)
类型的性质的外控件被动用她。如上所述,对于
ItemsControl.aspx)
对象(例如
ListBox.aspx)),它是
ItemTemplate.aspx)属性。
对于
ContentControl.aspx)
对象,它是
ContentTemplate.aspx)
属性。

 

 

DataType 属性

DataTemplate.aspx)
类具有
DataType.aspx)
属性,该属性很相近于
Style.aspx)
类的
TargetType.aspx)
属性。因此,在上述示范中未欲为
DataTemplate.aspx)
指定 x:Key,您可执行以下操作:

 

<DataTemplate DataType="{x:Type local:Task}">
  <StackPanel>
    <TextBlock Text="{Binding Path=TaskName}" />
    <TextBlock Text="{Binding Path=Description}"/>
    <TextBlock Text="{Binding Path=Priority}"/>
  </StackPanel>
</DataTemplate>

斯 DataTemplate 自动应用叫所有 Task 对象。
请注意,在这种景象下,x:Key 是隐式设置的。 因此,如果要是呢这
DataTemplate 分配一个 x:Key 值,则只要再写隐式 x:Key
并且不见面活动应用 DataTemplate。

设若只要用
ContentControl.aspx)绑定到
Task 对象的聚集,则
ContentControl.aspx)不见面自行使用上述
DataTemplate.aspx)。
这是坐当
ContentControl.aspx)上绑定需要更多的音信来区别是要是绑定到全方位集合还是如绑定到么对象。
如果
ContentControl.aspx)要跟踪对
ItemsControl.aspx)类型的精选,您得将
ContentControl 绑定的 Path 属性设置为“/”以代表若对脚下件感兴趣。
有关示例,请参见如何:绑定到集合并基于选择显示信息。 否则,需要通过安装
ContentTemplate 属性显式指定 DataTemplate。
DataType 属性在您拥有不同品类数据对象的
CompositeCollection.aspx)
时越发有因此。 有关示例,请参见如何:实现
CompositeCollection.aspx)。

 

向 DataTemplate 添加更多信息

 

即,数据显示了必要的消息,但是还足以显得更多信息。让咱透过添加
Border.aspx)、Grid.aspx)
和局部用以描述如显示的数额的
TextBlock.aspx)
来显示更多信息。

<DataTemplate x:Key="myTaskTemplate">
  <Border Name="border" BorderBrush="Aqua" BorderThickness="1"
          Padding="5" Margin="5">
    <Grid>
      <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
      </Grid.ColumnDefinitions>
      <TextBlock Grid.Row="0" Grid.Column="0" Text="Task Name:"/>
      <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=TaskName}" />
      <TextBlock Grid.Row="1" Grid.Column="0" Text="Description:"/>
      <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Description}"/>
      <TextBlock Grid.Row="2" Grid.Column="0" Text="Priority:"/>
      <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Priority}"/>
    </Grid>
  </Border>


...


</DataTemplate>

 

下的屏幕快照使用是就修改的
DataTemplate.aspx)
来显示
ListBox.aspx)。

图片 3

 

俺们可于
ListBox.aspx)
上将
HorizontalContentAlignment.aspx)
设置为
Stretch.aspx)
来确保件之宽占据整个空间:

 

<ListBox Width="400" Margin="10"
     ItemsSource="{Binding Source={StaticResource myTodoList}}"
     ItemTemplate="{StaticResource myTaskTemplate}" 
     HorizontalContentAlignment="Stretch"/>

图片 4

 

 

参考

原文见:http://msdn.microsoft.com/zh-cn/library/ms742521(v=vs.110).aspx

相关文章

网站地图xml地图