WPF之模板:斑斓呈现

来源:互联网 发布:淘宝默认好评图 编辑:程序博客网 时间:2024/06/07 22:35

说明:以下内容整理自MSDN,在有一定的基础之上,供快速学习复习使用。

1.数据模板:DateTemplate

一般可使用 DataTemplate 来指定数据的可视表示形式。 DataTemplate 对象在将ItemsControl(如 ListBox)绑定到整个集合时尤其有用。 如果没有特殊说明,ListBox 将在集合中显示对象的字符串表示形式。 在此情况下,可以使用 DataTemplate 定义数据对象的外观。 DataTemplate 的内容变成数据对象的可视结构。

可以在 DataTemplate 中使用数据绑定。 例如,假定 ListBox 绑定到 Customer 对象的集合,并且将 ItemTemplate 属性设置为 DataTemplate 创建 ListBox 时,将为集合中的每个 Customer 创建一个 ListBoxItem,并将 ListBoxItem 的 DataContext 设置为相应的客户。 也就是说,第一个 ListBoxItem 的 DataContext 设置为第一个客户,第二个ListBoxItem 的 DataContext 设置为第二个客户,依此类推。 可以将 DataTemplate 中的元素绑定到 Customer 对象的属性。

还可以使用 DataTemplate 在多个 ContentControl 对象之间共享 UIElement 对象。 例如,假设需要应用程序上的多个按钮具有相同的图形。 可以创建一个包含此图形的DataTemplate,并将它用作这些按钮的 ContentTemplate 有关更多信息,请参见ContentControl.ContentTemplate

可以将 DataTemplate 作为 object.ItemTemplate 属性元素的直接子级。 还可以定义一个 DataTemplate 作为资源,然后将该资源作为 ItemTemplate 属性的值引用。

定义用于创建数据模板的内容的 XAML 用法不作为可设置的属性公开。 这是内置于DataTemplate 对象元素的 XAML 处理的特殊行为。

示例

下面的示例使用 DataTemplate 显示 ListBox 的项。 在此示例中,ListBox 绑定到Customer 对象的集合。 DataTemplate 包含 TextBlock 控件,这些控件绑定到FirstNameLastName 和 Address 属性。 有关数据绑定的更多信息,请参见数据绑定

XAML
<Grid>    <Grid.Resources>        <src:Customers x:Key="customers"/>    </Grid.Resources>    <ListBox ItemsSource="{StaticResource customers}" Width="350" Margin="0,5,0,10">        <ListBox.ItemTemplate>            <DataTemplate>                <StackPanel Orientation="Horizontal">                    <TextBlock Padding="5,0,5,0"          Text="{Binding FirstName}" />                    <TextBlock Text="{Binding LastName}" />                    <TextBlock Text=", " />                    <TextBlock Text="{Binding Address}" />                </StackPanel>            </DataTemplate>        </ListBox.ItemTemplate>    </ListBox></Grid>

下面的示例演示 Customer 类和 ListBox 绑定到的集合。

C#
public class Customer{    public String FirstName { get; set; }    public String LastName { get; set; }    public String Address { get; set; }    public Customer(String firstName, String lastName, String address)    {        this.FirstName = firstName;        this.LastName = lastName;        this.Address = address;    }}public class Customers : ObservableCollection<Customer>{    public Customers()    {        Add(new Customer("Michael", "Anderberg",                "12 North Third Street, Apartment 45"));        Add(new Customer("Chris", "Ashton",                "34 West Fifth Street, Apartment 67"));        Add(new Customer("Cassie", "Hicks",                "56 East Seventh Street, Apartment 89"));        Add(new Customer("Guido", "Pica",                "78 South Ninth Street, Apartment 10"));    }}