Windows Phone开发(14):数据模板

移动开发
哪些控件最有可能用到数据模板?其实很多,只要是ContentControl的子类基本上都可以,如 Button等,当然,这些控件一般没那必要,按钮多数情况下显示一些文本提示用户用来干什么的就可以了,顶多你放个图标在按钮上,估计也很少人把一段视频放在按钮上吧,呵呵,其实,在WP里面,这是可以的,但没有必要。对的,一般列表形式的控件就最有可能使用到数据模板了,比如ListBox控件,如果你的列表控件只是让用户看信息的,而不需要额外操作,你完全可以考虑使用ListBox的“老爸”——ItemsControl。

数据模板,如果你仅仅听到这个名词,你一定很迷惑,什么来的?用来干什么的?不急,亲,今天,我们一起来探索一下吧。
用白话文说,数据模板就是用来规范数据的显示方式的,关于模板,估计各位不陌生的,大家应该玩过PPT吧,都做过演示文稿吧,对啊,PPT里面有很多模板 的,明白了吧?不明白?那你一定填过表吧,如果报考什么考试的,你肯定会被要求填一些什么报名表之类的,或者说,找过工用吗?是啊,做简历也有简历模板。 模板的用法就像做填空题,有了部分规范的内容,然后你按照这个规范,在特定的位置填上恰当的内容,你总不能说把你的姓名填到“性别”那里去吧,这就不符合 规范了。
好了,废话讲了不少,下面进入正题,你想想,哪些控件最有可能用到数据模板?哈,其实很多,只要是ContentControl的子类基本上都可以,如 Button等,当然,这些控件一般没那必要,按钮嘛,多数情况下显示一些文本提示用户用来干什么的就可以了,顶多你放个图标在按钮上,估计也很少人把一 段视频放在按钮上吧,呵呵,其实,在WP里面,这是可以的,但没有必要。
对的,一般列表形式的控件就最有可能使用到数据模板了,比如ListBox控件,如果你的列表控件只是让用户看信息的,而不需要额外操作,你完全可以考虑使用ListBox的“老爸”——ItemsControl。

好,下面我们用一个例子看看在不自定义数据模板的情况下,ItemsControl的列表项是如何显示的。
首先,当然是新建一个项目了,不用我介绍,相信各位都会。

  1. <phone:PhoneApplicationPage    
  2.     x:Class="DataTemplateSample.pageA"   
  3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
  5.     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"   
  6.     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"   
  7.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"   
  8.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"   
  9.     FontFamily="{StaticResource PhoneFontFamilyNormal}"   
  10.     .......   
  11.     >   
  12.    
  13.     <ItemsControl x:Name="myItemControl"/>   
  14.    
  15. </phone:PhoneApplicationPage>

然后,切换到代码页,把myItemControl的数据源设置为一个字符串数组。

  1. public pageA()   
  2. {   
  3.     InitializeComponent();   
  4.    
  5.     this.myItemControl.ItemsSource = new string[] {   
  6.                 "玉米炒蛋",   
  7.                 "烧鸭饭",   
  8.                 "青瓜炒肉",   
  9.                 "水煮豆腐",   
  10.                 "糯米鸡"   
  11.     };   
  12. }   

好的,不要流口水啊,现在,你可以运行你的超级项目了。
你应该发现了,列表的每一项都是以文本的方式显示,其实,它内部默认就是一个TextBlock,就是用来显示文本的。
那么,如果我设置的数据源不是字符会怎么样呢?
好现在看第二个例子。
先做好布局,和刚才的例子一样。

  1. <phone:PhoneApplicationPage    
  2.     x:Class="DataTemplateSample.pageB"   
  3.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
  4.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
  5.     xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"   
  6.     xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"   
  7.     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"   
  8.     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"   
  9.      .......   
  10.     >   
  11.     <ItemsControl Name="myItemsControl" FontSize="52"/>   
  12. </phone:PhoneApplicationPage>  

接着我们定义一个商品类,包含三个属性:商品名称,单价,条码。
并把ItemsControl的数据源设置为商品类的集合。

  1. public partial class pageB : PhoneApplicationPage   
  2. {   
  3.     public pageB()   
  4.     {   
  5.         InitializeComponent();   
  6. em.Collections.ObjectModel.ObservableCollection<Goods> goodsList = new System.Collections.ObjectModel.ObservableCollection<Goods>   
  7.         {   
  8.             new Goods{GoodsName="纸飞机",Price=0.02f,BarCode ="21001475"},   
  9.             new Goods{GoodsName="鸡蛋",Price=0.6f,BarCode="21002345"},   
  10.             new Goods{GoodsName="干面包",Price=2.5f,BarCode="21003087"},   
  11.             new Goods{GoodsName="地沟油",Price=33.4f,BarCode="21002020"},   
  12.             new Goods{GoodsName="茅台啤酒",Price=108f,BarCode="21009331"}   
  13.         };   
  14.         this.myItemsControl.ItemsSource = goodsList;   
  15.     }   
  16. }   
  17. public class Goods   
  18. {   
  19.     /// <summary>   
  20.     /// 商品价格   
  21.     /// </summary>   
  22.     public string GoodsName { getset; }   
  23.     /// <summary>   
  24.     /// 商品单价   
  25.     /// </summary>   
  26.     public float Price { getset; }   
  27.     /// <summary>   
  28.     /// 商品条形码   
  29.     /// </summary>   
  30.     public string BarCode { getset; }   
  31. }   

运行一下,啊,你会大吃一惊,怎么显示这内容?
(图1)

http://s3.51cto.com/wyfs01/M01/07/10/wKioOVFuNcWx88u6AACMJKFT_tM005.jpg

 

前文说了,数据模板默认是TextBlock控件,只能显示文本,那么,当它遇到非文本数据时,就会尝试调用数据源中类型的ToString方法,所以刚 才的示例才会显示出类名,这是从Object类继承过来的ToString方法,现在我们把Goods类改一下,重写它的ToString方法,看看结果是什么。

  1. public override string ToString()   
  2. {   
  3.     return this.GoodsName;   
  4. }   

这时候你再运行一下,看到商品名称了吧?

然而,你会发现,好像还没有满足我们的需求,我们希望每一项中同时显示商品名,单价,条码值,那怎么办呢?是的,这时候,就真的要自定义数据模板了。

把上面的XAML改一下。

  1. <ItemsControl Name="myItemsControl" FontSize="52">   
  2.     <ItemsControl.ItemTemplate>   
  3.         <DataTemplate>   
  4.             <Grid Margin="0,0,0,27">   
  5.                 <Grid.ColumnDefinitions>   
  6.                     <ColumnDefinition Width="auto"/>   
  7.                     <ColumnDefinition Width="*"/>   
  8.                 </Grid.ColumnDefinitions>   
  9.                 <Grid.RowDefinitions>   
  10.                     <RowDefinition Height="auto"/>   
  11.                     <RowDefinition Height="auto"/>   
  12.                     <RowDefinition Height="auto"/>   
  13.                 </Grid.RowDefinitions>   
  14.                 <TextBlock Grid.Column="0" Grid.Row="0" Text="商品:"/>   
  15.                 <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding GoodsName}"/>   
  16.                 <TextBlock Grid.Column="0" Grid.Row="1" Text="单价:"/>   
  17.                 <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding Price}"/>   
  18.                 <TextBlock Grid.Column="0" Grid.Row="2" Text="条码:"/>   
  19.                 <TextBlock Grid.Column="1" Grid.Row="2" Text="{Binding BarCode}"/>   
  20.             </Grid>   
  21.         </DataTemplate>   
  22.     </ItemsControl.ItemTemplate>   
  23. </ItemsControl>   

好了,现在就基本达到我们的要求了。
(图2)

责任编辑:闫佳明 来源: oschina
相关推荐

2013-04-17 14:19:51

Windows PhoWindows Pho

2012-06-06 13:48:34

Windows Pho

2013-07-30 12:37:56

Windows PhoWindows Pho

2010-04-21 17:07:54

Windows Pho

2011-06-07 12:42:15

Windows Pho

2013-04-17 14:00:06

Windows PhoWindows Pho

2013-04-19 16:34:56

Windows PhoWindows Pho

2013-04-16 17:02:50

Windows Pho概论

2013-07-30 11:18:37

Windows PhoWindows Pho

2010-04-08 17:40:23

Windows Pho

2013-04-17 14:47:19

Windows PhoWindows Pho

2011-06-07 11:35:38

Windows Pho

2010-07-16 15:29:02

Windows Pho

2012-08-16 10:35:50

Windows Pho

2013-07-31 13:03:51

Windows PhoWindows Pho

2010-12-14 18:48:49

微软

2013-07-31 13:13:50

Windows PhoMVVM模式

2013-04-19 16:52:24

Windows PhoWindows Pho

2013-04-19 15:35:54

Windows Pho隔离存储

2012-06-04 14:47:58

Windows Pho
点赞
收藏

51CTO技术栈公众号