关闭

Wpf DataTemplate 部分功能使用心得

标签: wpf对象结构
101人阅读 评论(0) 收藏 举报
分类:

DataTemplate介绍

DataTemplate是一种数据展示样式,按照官方的话来说是描述数据对象的可视结构(“Describes the visual structure of a data object.”)这种说法有点抽象,我们来看几个exsample。

<Window x:Class="DataTemplate.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">
    <Grid>
        <ContentControl Content="{Binding PersonOne}" ></ContentControl>
    </Grid>
</Window>
using System.Windows;

namespace DataTemplate
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {


        public Person PersonOne { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            PersonOne = new Person();
            PersonOne.Gender=Gender.Male;
            PersonOne.Age = 12;
            PersonOne.FisrtName = "Allen";
            PersonOne.LastName = "Xie";

            this.DataContext = this;
        }
    }
}

该程序运行的效果如下图所示:
这里写图片描述

可以看到该效果没有加入任何样式,只是打印了该对象类的全名称(命名空间+类名)。可能有些人已经看出来了,该样式只是采用了对象的ToString()方法。我们可以试一下重写一下ToString()。

public override string ToString()
        {
            return FisrtName +" : "+ LastName;
        }

这里写图片描述

这种方式过于死板,样式上缺乏变化。所以DataTemplate就有用武之地了,我们对样式稍加一些变化:

<Window x:Class="DataTemplate.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">
    <Grid>
        <ContentControl Content="{Binding PersonOne}" >
             <ContentControl.ContentTemplate>
                 <DataTemplate>
                     <StackPanel>
                        <TextBlock Text="{Binding FisrtName}" FontSize="20"></TextBlock>
                        <TextBlock Text="{Binding Age}" FontSize="13"></TextBlock>
                     </StackPanel>
                 </DataTemplate>
             </ContentControl.ContentTemplate>
        </ContentControl>
    </Grid>
</Window>

出来的效果是这样的
这里写图片描述

当然可以做的变化可不止这么多,各位设计大神可以在里面加很多样式之类的东西,在此就不在做过多的介绍了。

DataTemplate X:Key和 X:Type

如果这个模板要在多个样式中使用,我们可以这样设计,避免在控件中重复添加DataTemplate。

<Window x:Class="DataTemplate.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="PersonTemplate">
            <StackPanel>
                <TextBlock Text="{Binding FisrtName}" FontSize="20"></TextBlock>
                <TextBlock Text="{Binding Age}" FontSize="13"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <ContentControl Content="{Binding PersonOne}" ContentTemplate="{StaticResource PersonTemplate}" />

            <ContentControl Content="{Binding PersonOne}" ContentTemplate="{StaticResource PersonTemplate}" />
        </StackPanel>
    </Grid>
</Window>
<Window x:Class="DataTemplate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dataTemplate="clr-namespace:DataTemplate"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type dataTemplate:Person}">
            <StackPanel>
                <TextBlock Text="{Binding FisrtName}" FontSize="20"></TextBlock>
                <TextBlock Text="{Binding Age}" FontSize="13"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <ContentControl Content="{Binding PersonOne}"  />

            <ContentControl Content="{Binding PersonOne}"  />
        </StackPanel>
    </Grid>
</Window>

两种设计方式都能达到同样的效果,x:Key 相当于一个键值,控件需要这个样式,就可以用ContentTemplate绑定这个样式。当然DataTemplate也可以放在特定的资源文件中。

相比x:key DateType属于稍显强制的绑定。当您将该属性设置为数据类型而不指定 x:Key 时,DataTemplate 将自动应用于该类型的数据对象。请注意,执行该操作时,将隐式设置 x:Key。因此,如果要为此 DataTemplate 分配一个 x:Key 值,则要重写隐式 x:Key 并且不会自动应用 DataTemplate。这也是一种多态的应用

这里写图片描述

DataType还有个比较高级的用法,当您在前台控件绑定到一个抽象级别较高的对象时(比如: object、抽象类、接口),您可以通过在后台给赋予不同类型的值让它绑定不同的DataTemplate,展示不同的页面样式。

<Window x:Class="DataTemplate.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dataTemplate="clr-namespace:DataTemplate"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <DataTemplate DataType="{x:Type dataTemplate:Person}">
            <StackPanel>
                <TextBlock Text="{Binding FisrtName}" FontSize="20"></TextBlock>
                <TextBlock Text="{Binding Age}" FontSize="13"></TextBlock>
            </StackPanel>
        </DataTemplate>
        <DataTemplate DataType="{x:Type dataTemplate:Animal}">
            <StackPanel>
                <TextBox Text="{Binding FisrtName}" FontSize="20" Foreground="Red"></TextBox>
                <TextBox Text="{Binding Age}" FontSize="13" Foreground="Red"></TextBox>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <StackPanel>
            <ContentControl Content="{Binding PersonOne}"  />

            <ContentControl Content="{Binding PersonOne}"  />
        </StackPanel>
    </Grid>
</Window>
using System.Windows;

namespace DataTemplate
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {


        public object PersonOne { get; set; }

        public MainWindow()
        {
            InitializeComponent();

            Animal po = new Animal();
            po.Gender = Gender.Male;
            po.Age = 12;
            po.FisrtName = "Allen";
            po.LastName = "Xie";
            PersonOne = po;

            this.DataContext = this;
        }
    }
}

给PersonOne赋值 Animal时 呈现的样式如下图所示
这里写图片描述

如需转载 请备注

1
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:609次
    • 积分:75
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档