上文简单介绍了数据绑定。下面简单介绍一下数据模板选择。这是非常实用的,举个例子,我们做一个新闻app,来的数据源有的是纯文字(标题加文字内容),有的丰富一些(标题+文字内容+图片),还有的是(标题+文字内容+视频),那么如果用ListView这样的控件显示这样的数据源,数据模板的样式必须不同,这时候需要根据数据源的数据来判断使用何种模板进行显示。
上面是我做的一个小游戏,使用的是同一个ListView但根据后台数据不同显示了不同的模板。如何根据数据选择模板?其实并不难。首先建立一个类。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace 开心打地鼠.Models { class MyTemplateSelector: DataTemplateSelector { public DataTemplate DataTemplate0 { get; set; } public DataTemplate DataTemplate1 { get; set; } public DataTemplate DataTemplate2 { get; set; } public DataTemplate DataTemplate3 { get; set; } public DataTemplate DataTemplate4 { get; set; } public DataTemplate DataTemplate5 { get; set; } public DataTemplate DataTemplate6 { get; set; } protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { ItemsControl.ItemsControlFromItemContainer(container) as GridView; //int index = Gv.IndexFromContainer(container); Level ThisLevel = item as Level; //先判断 是否被锁定 if (ThisLevel.Locked=="1") { return DataTemplate0;//锁定,返回模板0 } else { switch (ThisLevel.Stars) { case "0": return DataTemplate1;//未锁定,返回模板1 0星 case "1": return DataTemplate2;//未锁定,返回模板2 1星 case "2": return DataTemplate3;//未锁定,返回模板3 2星 case "3": return DataTemplate4;//未锁定,返回模板4 3星 case "4": return DataTemplate5;//未锁定,返回模板5 4星 case "5": return DataTemplate6;//未锁定,返回模板6 5星 default: break; } } return base.SelectTemplateCore(item, container); } } }在xaml页面引用这个类。在Page的resource的面加入这些模板和selector,如下:
<Page.Resources> <!--关卡模板0--> <DataTemplate x:Key="DataTemplate0"> ... </DataTemplate> <!--关卡模板1--> <DataTemplate x:Key="DataTemplate1"> ... </DataTemplate> <!--关卡模板2--> <DataTemplate x:Key="DataTemplate2"> ... </DataTemplate> <!--关卡模板3--> <DataTemplate x:Key="DataTemplate3"> ... </DataTemplate> <!--关卡模板4--> <DataTemplate x:Key="DataTemplate4"> ... </DataTemplate> <!--关卡模板5--> <DataTemplate x:Key="DataTemplate5"> ... </DataTemplate> <!--关卡模板6--> <DataTemplate x:Key="DataTemplate6"> ... </DataTemplate> <Models:MyTemplateSelector x:Key="Selector" x:Name="MyTemplateSelector" DataTemplate0="{StaticResource DataTemplate0}" DataTemplate1="{StaticResource DataTemplate1}" DataTemplate2="{StaticResource DataTemplate2}" DataTemplate3="{StaticResource DataTemplate3}" DataTemplate4="{StaticResource DataTemplate4}" DataTemplate5="{StaticResource DataTemplate5}" DataTemplate6="{StaticResource DataTemplate6}"> </Models:MyTemplateSelector> </Page.Resources>
最后在数据绑定的控件上指定selector(同时后台赋予DataContext),即完成了根据数据选择模板。(根据我的代码修改即可),其中代码段中ThisLevel就是后台绑定的数据对象,根据其中数据内容决定返回何种模板(根据需要)。
<GridView Margin="20,0,20,0" ItemTemplateSelector="{StaticResource Selector}" ItemsSource="{Binding}" Name="GridView_Levels"> </GridView>