一、我们知道WPF数据模板是当我们给定一个数据类型,我们为这个数据类型写好布局,就给这种数据类型穿上了外衣。
下面这个例子,能够帮助大家充分理解数据模板就是数据类型的外衣的意思:(里面的MyListBoxItemTemplete模板,上一个博客中有写https://www.cnblogs.com/bigbosscyb/p/11939201.html)
<Window x:Class="MyTemplete.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MyTemplete" xmlns:mm="clr-namespace:System.Collections;assembly=mscorlib" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <!--针对于UserInfo的数据模板--> <DataTemplate x:Key="ItemTemplete2" DataType="{x:Type local:UserInfo}"> <Grid> <StackPanel Orientation="Horizontal"> <Rectangle Fill="Orange" Stroke="Yellow" Width="{Binding UserWords.Length}"/> <TextBlock Text="{Binding UserName}"/> </StackPanel> </Grid> </DataTemplate> <!--数据源--> <mm:ArrayList x:Key="sources"> <local:UserInfo UserLogo="pack://application:,,,/MyTemplete;component/Pic/chaoge.jpg" UserName="超哥" UserWords="我随手一打就是标准的十五字"/> <local:UserInfo UserLogo="pack://application:,,,/MyTemplete;component/Pic/minshener.jpg" UserName="敏婶儿" UserWords="我随手一打就是标准的十五字我差不多就是你超哥的两倍服不服"/> <local:UserInfo UserLogo="pack://application:,,,/MyTemplete;component/Pic/bobo.jpg" UserName="博哥" UserWords="我就算了我少一点好啦你们随意就好"/> </mm:ArrayList> </Window.Resources> <StackPanel> <ListBox HorizontalAlignment="Center" ItemTemplate="{StaticResource ItemTemplete2}" ItemsSource="{StaticResource sources}"/> <ComboBox ItemTemplate="{StaticResource MyListBoxItemTemplete}" ItemsSource="{StaticResource sources}"/> </StackPanel> </Window>
效果图如下:
从上面的效果图上我们可以看到,上下两个列表项是同一种数据类型展示出来的不同外观,这就是数据模板的魅力。
二、数据模板除了能够加载CLR类型数据外,还能够加载XML类型数据。
知识点:
1、你需要知道XmlDataProvider可以作为资源来使用这个标签的x:Xdata属性的值就是XML节点;
2、DataTemplete中要想读取节点属性,需要以XPATH=@节点属性名的形式来读取;
3、DataTemplete的DataType属性的值是要读取的XML数据的节点名。
下面便以一个实例来了解一下DataTemplete是如何应用到XML数据上的:
<Window x:Class="MyTemplete.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MyTemplete" xmlns:mm="clr-namespace:System.Collections;assembly=mscorlib" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <!--数据源 XML数据--> <XmlDataProvider x:Key="xmlSource" XPath="Users/User"> <x:XData> <Users xmlns=""> <User UserName="超哥" UserMoney="200"/> <User UserName="敏婶儿" UserMoney="396"/> <User UserName="博哥" UserMoney="247"/> </Users> </x:XData> </XmlDataProvider> <!--以XML种的User节点数据类型定制DataTemplete--> <DataTemplate x:Key="xmlDataTemplete" DataType="User"> <Grid> <StackPanel Orientation="Horizontal"> <Rectangle Fill="Orange" Stroke="Yellow" Width="{Binding XPath=@UserMoney}"/> <TextBlock Text="{Binding XPath=@UserName}"/> </StackPanel> </Grid> </DataTemplate> </Window.Resources> <StackPanel> <ListBox HorizontalAlignment="Center" ItemTemplate="{StaticResource xmlDataTemplete}" ItemsSource="{Binding Source={StaticResource xmlSource}}"/> <ComboBox ItemTemplate="{StaticResource xmlDataTemplete}" ItemsSource="{Binding Source={StaticResource xmlSource}}"/> </StackPanel> </Window>
运行效果如下: