WPF中的数据模板(DataTemplate)(转)

原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html

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方式来打造一个个性列表控件来得更方便。

时间: 2024-08-10 15:00:37

WPF中的数据模板(DataTemplate)(转)的相关文章

WPF 后台获得 数据模板里的内容控件(DataTemplate)

原文:WPF 后台获得 数据模板里的内容控件(DataTemplate) 假如 <Window.Resources> 里 有一个 Datatemplate 我想获得TextBlock XAML <DataTemplate x:Key="dtName"> <TextBlock Text="content"/> </DataTemplate> 后台代码 DataTemplate d = this.FindResource(

在WPF中获取DataGridTemplateColumn模板定义的内容控件

xaml格式描述: <DataGrid Name="dataGrid" Grid.Row="1" ItemsSource="{Binding}"  >            <DataGrid.Columns>              <DataGridTemplateColumn Header="描述">                    <DataGridTemplateCo

WPF的ComboBox 数据模板自定义

WPF的ComboBox 有些时候不能满足用户需求,需要对数据内容和样式进行自定义,下面就简要介绍一下用数据模板(DataTemplate)的方式对ComboBox 内容进行定制: 原型设计如下: 步骤: 1.新建一个WPF应用程序WpfAppDemo(VS2012),并新建一个images文件夹(上传图片素材); 2.在主界面MainWindow.xaml文件中添加一个Label.ComboBox 和Button控件,如下图: 代码如下: 1 <Window x:Class="WpfAp

WPF 中获取DataGrid 模板列中控件的对像

#region 当前选定行的TextBox获得焦点 /// <summary> /// 当前选定行的TextBox获得焦点 /// </summary> public void SelectedRowTBFocus() { if (SelectIndex != -1) { FrameworkElement item = grid.Columns[6].GetCellContent(grid.Items[SelectIndex]); DataGridTemplateColumn te

WPF 中关于 DataTemplateSelector 类的应用

MSDN的解释: 提供一种根据数据对象和与该数据绑定的元素来选择数据模板 DataTemplate 的方法. 示例代码: <Window x:Class="WpfApplication1.Window2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

WPF中的MultiBinding

在WPF中进行数据绑定时,有时会有这种需求:如TextBlock的Text属性,可能希望绑定到两个或以上的数据源,最后得到的Text显示是由这几个数据源按照自己的设计组合而成,即MultiBinding功能.这里记录下两种用法(绑定的概念这里就不列了,直接上关键代码): 1.在XAML中使用MultiBinding+StringFormat <TextBlock> <TextBlock.Text> <MultiBinding StringFormat="{}{0}

WPF数据模板中绑定事件不触发问题

今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定事件,直接采用内联事件的写法,将事件写在控件上,并且事件的处理写在cs代码而非ViewModel中,则可以使用,如此可以判断是采用MVVM时,命令没有成功绑定到事件上. 刚开始以为是DevExpress的MVVM框架的BUG.后来改成自己手写的MVVM,并未解决问题,思考再三,觉得是数据模板并未获取

控件中数据模板禁用小键盘减号折叠

WPF里面自定义了TreeListView控件,在树列表项的数据模板中添加了文本框,当在文本框内输入小键盘的减号时,自动折叠:因为小键盘+与-符号是自动折叠的:可以对win7及以上系统 的文件夹列表树,进行验证:为了禁止输入时不折叠,使用以下代码实现 <controls:TreeListView.Columns> <GridViewColumn Header="列头名称"> <DataTemplate> <TextBox Text="

关于WPF中关于样式和模板的区别

百度了下,改天整理. WPF中关于样式和模板的区别: 回答一: 1.WPF样式类似于Web应用程序中的CSS,在WPF中可以为控件定义统一的样式(Style).样式属于资源的一种,例如为Button定义统一的背景颜色和字体: <Window.Resources> <Style  TargetType="Button"> <Setter Property="Background" Value="Yellow" />