Windows Phone開發(14):數據模板

數據模板,如果你僅僅聽到這個名詞,你一定很迷惑,什麼來的?用來幹什麼的?不急,親,今天,我們一起來探索一下吧。
用白話文說,數據模板就是用來規範數據的顯示方式的,關於模板,估計各位不陌生的,大家應該玩過PPT吧,都做過演示文稿吧,對啊,PPT裏面有很多模板的,明白了吧?不明白?那你一定填過表吧,如果報考什麼考試的,你肯定會被要求填一些什麼報名表之類的,或者說,找過工用嗎?是啊,做簡歷也有簡歷模板。模板的用法就像做填空題,有了部分規範的內容,然後你按照這個規範,在特定的位置填上恰當的內容,你總不能說把你的姓名填到“性別”那裏去吧,這就不符合規範了。
好了,廢話講了不少,下面進入正題,你想想,哪些控件最有可能用到數據模板?哈,其實很多,只要是ContentControl的子類基本上都可以,如Button等,當然,這些控件一般沒那必要,按鈕嘛,多數情況下顯示一些文本提示用戶用來幹什麼的就可以了,頂多你放個圖標在按鈕上,估計也很少人把一段視頻放在按鈕上吧,呵呵,其實,在WP裏面,這是可以的,但沒有必要。
對的,一般列表形式的控件就最有可能使用到數據模板了,比如ListBox控件,如果你的列表控件只是讓用戶看信息的,而不需要額外操作,你完全可以考慮使用ListBox的“老爸”——ItemsControl。

好,下面我們用一個例子看看在不自定義數據模板的情況下,ItemsControl的列表項是如何顯示的。
首先,當然是新建一個項目了,不用我介紹,相信各位都會。
你完全可以這樣,把頁面內的Grid根容器都刪除,直接扔一個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.   
  12.     <ItemsControl Name="myItemsControl" FontSize="52"/>  
  13.   
  14. </phone:PhoneApplicationPage>  


接着我們定義一個商品類,包含三個屬性:商品名稱,單價,條碼。
並把ItemsControl的數據源設置爲商品類的集合。

  1. public partial class pageB : PhoneApplicationPage  
  2. {  
  3.     public pageB()  
  4.     {  
  5.         InitializeComponent();  
  6.   
  7.         System.Collections.ObjectModel.ObservableCollection<Goods> goodsList = new System.Collections.ObjectModel.ObservableCollection<Goods>  
  8.         {  
  9.             new Goods{GoodsName="紙飛機",Price=0.02f,BarCode ="21001475"},  
  10.             new Goods{GoodsName="雞蛋",Price=0.6f,BarCode="21002345"},  
  11.             new Goods{GoodsName="乾麪包",Price=2.5f,BarCode="21003087"},  
  12.             new Goods{GoodsName="地溝油",Price=33.4f,BarCode="21002020"},  
  13.             new Goods{GoodsName="茅臺啤酒",Price=108f,BarCode="21009331"}  
  14.         };  
  15.         this.myItemsControl.ItemsSource = goodsList;  
  16.     }  
  17. }  
  18.   
  19. public class Goods  
  20. {  
  21.     /// <summary>  
  22.     /// 商品價格  
  23.     /// </summary>  
  24.     public string GoodsName { getset; }  
  25.   
  26.     /// <summary>  
  27.     /// 商品單價  
  28.     /// </summary>  
  29.     public float Price { getset; }  
  30.   
  31.     /// <summary>  
  32.     /// 商品條形碼  
  33.     /// </summary>  
  34.     public string BarCode { getset; }  
  35. }  


 

運行一下,啊,你會大吃一驚,怎麼顯示這內容?
(圖1)

前文說了,數據模板默認是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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章