WPF-数据模板深入(加载XML类型数据)

一、我们知道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>

运行效果如下:

数据模板的数据类型是XML

猜你喜欢

转载自www.cnblogs.com/bigbosscyb/p/11942116.html