• WPF中的数据模板(DataTemplate)


                                                                                      WPF中的数据模板(DataTemplate)
                                                                                                                              周银辉

    在WPF中我们可以为自己的数据定制显示方式,也就是说虽然某数据数据是一定的,但我们可以做到让它的表现方式多种多样,比如一个时间,在以前我们一般使用一个字符串(比如“12:03”)来显示,但我们为什么就不能显示一个小时钟呢,其实这更合乎情理,利用WPF中的数据模板技术随意并轻松地表现你的数据.

    数据模板适用于Content Control类控件与Items Control类控件.

    我们假设有如下一个类
    using System;

    namespace Demo
    {
        
    public class People
        
    {
            
    private string name;

            
    private string photo;

            
    public People(string name, string photo)
            
    {
                
    this.name = name;
                
    this.photo = photo;
            }


            
    public string Name
            
    {
                
    get
                
    {
                    
    return this.name;
                }

                
    set
                
    {
                    
    this.name = value;
                }

            }


            
    public string Photo
            
    {
                
    get
                
    {
                    
    return this.photo;
                }

                
    set
                
    {
                    
    this.photo = value;
                }

            }

        }

    }

    这个类很简单地表示了一个人,他的姓名和他的照片(路径)

    如果在我们的软件中有一个列表控件ListBox来显示一个由多个人组成的列表,在.net 3.0以前我们可能就只能用文本来列出人的姓名而已,或者花不少的精力来重写列表控件以便在列表中在显示人名的同时显示照片.

    参考以下代码:
    <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource  MyTemplate}" />
    我们定义了一个ListBox,并将其ItemTemplate制定为我们自定义的MyTemplate,也就是说列表项将按照MyTemplate制定的方式来显示列表内容。
    这样我们就可以发挥我们的想像力来自定义MyTemplate
    为了能在XAML中使用我们的People类,我们需要将其名字空间引入,参考以下代码:
    xmlns:demo="clr-namespace:Demo" 
    其中Demo是我们的People类所在的名字空间,以后可以使用demo来表示这个名字空间了.

    下面的代码来定义我们的MyTemplate模板,以便告诉我们的列表如何来显示他的项目:
    <Window.Resources>        
        
    <!--列表模板-->
        
    <DataTemplate x:Key="MyTemplate" DataType="{x:Type demo:People}">
          
    <Grid VerticalAlignment="Center" HorizontalAlignment="Center" Margin="4,4,4,4" >
            
    <Grid.ColumnDefinitions>
              
    <ColumnDefinition Width="Auto"/>
              
    <ColumnDefinition Width="Auto"/>
            
    </Grid.ColumnDefinitions>
            
    <Image Source="{Binding Photo}" Width="50" Height="50" Grid.Column="0" Grid.RowSpan="1"/>
            
    <TextBlock Text="{Binding Name}" Grid.Column="1" Grid.ColumnSpan="1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
          
    </Grid>
        
    </DataTemplate>
    </Window.Resources>
    我们将模板定义为窗口的资源,资源保存在一个资源字典中的,x:Key="MyTemplate" 表示其在资源字典中的键,DataType="{x:Type demo:People}"表示该数据模板针对的数据类型是demo名字空间下的People类,接下来在Gird中我们定义了该数据模板的视觉树,这也是我们的工作重心,即该视觉树定义了如何显示我们的数据。我们使用了一个Image控件并将其Source绑定到People的Photo属性上,这样以便在该Imag控件上显示照片,然后在Image的右边我们使用一个TextBlock控件来显示人名(将People的Name属性绑定到TextBlock的Text属性上)。
    注意到这个数据模板实际上在干什么:它定义了People类型对象的表现方式,在这里是显示People的照片并在照片的右方显示姓名。
    以后我们需要People对象按这种方式展示给用户的时候,我们只要将该数据模板指定给要显示People对象的那个控件就可以了。
    比如
    <ListBox x:Name="ListBox_PeopleList" ItemTemplate="{StaticResource  MyTemplate}" />
    就告诉我们的列表控件按照MyTemplate定义的方式来显示其项目。

    呵呵,这样是不是比以前Code方式来打造一个个性列表控件来得更方便。
  • 相关阅读:
    Mybatis3.1-[tp_36-37]-_映射文件_select_resultMap关联查询__分步查询传递多列值&fetchType_discriminator鉴别器
    Mybatis3.1-[tp_34-35]-_映射文件_select_resultMap关联查询_collection定义关联集合封装规则_collection分步查询_延迟加载
    Mybatis3.1-[tp_32-33]-_映射文件_select_resultMap关联查询_association分步查询_延迟加载
    Mybatis3.1-[tp-30-31]-select_resultMap_关联查询_级联属性封装结果__association定义关联对象封装规则
    Mybatis3.0-[tp_28-29]-映射文件-resultMap_自定义结果集映射规则_及关联环境的搭建
    MyBatis3_[tp-26-27]_映射文件_select_返回List_记录封装Map:返回单个元素的Map或者整体Map集合
    MyBatis 3.0_[tp-24-25]_映射文件_参数处理_#与$取值区别_#{}更丰富的用法
    mybatis3.1-[topic-18-20]-_映射文件_参数处理_单个参数&多个参数&命名参数 _POJO&Map&TO 三种方式及举例
    mybatis3.1-[topic-16-17]-映射文件_增删改查_insert_获取自增主键的值
    通过类名获取控件数组
  • 原文地址:https://www.cnblogs.com/zhouyinhui/p/694388.html
Copyright © 2020-2023  润新知