DataTemplate与ControlTemplate的关系与应用

决定控件外观的是ControlTemplate,决定数据外观的是DataTemplate。
这里写图片描述

把ControlTemplate应用在所有目标上需要借助Style来实现,Style不能标记x:Key,例如:

<Window.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border x:Name="Bd" SnapsToDevicePixels="True"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            CornerRadius="5">
                        <ScrollViewer SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Margin" Value="5" />
        <Setter Property="BorderBrush" Value="Black" />
        <Setter Property="Height" Value="25" />
    </Style>
</Window.Resources>
<Window.Background>
    <LinearGradientBrush EndPoint="0,1" StartPoint="1,0">
        <GradientStop Color="#FF00B0FF" Offset="0" />
        <GradientStop Color="White" Offset="1" />
    </LinearGradientBrush>
</Window.Background>
<StackPanel>
    <TextBox />
    <TextBox />
    <TextBox Style="{x:Null}" Margin="5" />
</StackPanel>

效果图
这里写图片描述

把DataTemplate应用在某个数据类型上的方法是设置DataTemplate的DataType属性,并且DataTemplate作为资源是也不能带有x:Key标记:

<Window.Resources>
    <DataTemplate DataType="{x:Type localEntity:Unit}">
        <Grid>
            <StackPanel Orientation="Horizontal">
                <Grid>
                    <Rectangle Stroke="Yellow" Fill="Orange" Width="{Binding Price}" />
                    <TextBlock Text="{Binding Year}" />
                </Grid>
                <TextBlock Text="{Binding Price}" Margin="5,0" />
            </StackPanel>
        </Grid>
    </DataTemplate>
    <!--数据源-->
    <c:ArrayList x:Key="ds">
        <localEntity:Unit Year="2001年" Price="100" />
        <localEntity:Unit Year="2002年" Price="120" />
        <localEntity:Unit Year="2003年" Price="140" />
        <localEntity:Unit Year="2004年" Price="160" />
        <localEntity:Unit Year="2005年" Price="180" />
        <localEntity:Unit Year="2006年" Price="200" />
    </c:ArrayList>
</Window.Resources>
<StackPanel>
    <ListBox ItemsSource="{StaticResource ds}" />
    <ComboBox ItemsSource="{StaticResource ds}" />
</StackPanel>

public class Unit
{
    public int Price { get; set; }
    public string Year { get; set; }
}

这里写图片描述

DataTemplate还可以读取XML文件中的数据,首先准备Data.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Data xmlns="">
  <Grade Name="一年级">
    <Class Name="甲班">
      <Group Name="A 组" />
      <Group Name="B 组" />
      <Group Name="C 组" />
    </Class>
    <Class Name="乙组">
      <Group Name="A 组" />
      <Group Name="B 组" />
      <Group Name="C 组" />
    </Class>
  </Grade>
  <Grade Name="二年级">
    <Class Name="甲班">
      <Group Name="A 组" />
      <Group Name="B 组" />
      <Group Name="C 组" />
    </Class>
    <Class Name="乙组">
      <Group Name="A 组" />
      <Group Name="B 组" />
      <Group Name="C 组" />
    </Class>
  </Grade>
</Data>

XAML为:

<Window.Resources>
    <!--数据源-->
    <XmlDataProvider x:Key="da" Source="Data.xml" XPath="Data/Grade" />
    <!--年纪模板-->
    <HierarchicalDataTemplate DataType="Grade" ItemsSource="{Binding XPath=Class}">
        <TextBlock Text="{Binding XPath=@Name}" />
    </HierarchicalDataTemplate>
    <!--班级模板-->
    <HierarchicalDataTemplate DataType="Class" ItemsSource="{Binding XPath=Group}">
        <RadioButton Content="{Binding XPath=@Name}" GroupName="gn" />
    </HierarchicalDataTemplate>
    <!--小组模块-->
    <HierarchicalDataTemplate DataType="Group" ItemsSource="{Binding XPath=Student}">
        <CheckBox Content="{Binding XPath=@Name}" />
    </HierarchicalDataTemplate>
</Window.Resources>
<Grid>
    <TreeView Margin="5" ItemsSource="{Binding Source={StaticResource da}}"/>
</Grid>

效果图:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF DataTemplate 是一种用于定义数据绑定方式的控件。它可以将数据对象和界面元素进行绑定,用于显示数据对象的内容。 下面是一个简单的 DataTemplate 示例: ```xml <DataTemplate DataType="{x:Type local:Person}"> <StackPanel> <TextBlock Text="{Binding FirstName}"/> <TextBlock Text="{Binding LastName}"/> </StackPanel> </DataTemplate> ``` 在上面的代码中,我们定义了一个 DataTemplate,它的 DataType 属性指定了数据对象的类型,这里是 local:Person。在 DataTemplate 中,我们使用了一个 StackPanel 控件,其中包含了两个 TextBlock 控件,用于显示 Person 对象的 FirstName 和 LastName 属性。通过在 TextBlock 的 Text 属性中使用 Binding 表达式,我们将控件与数据对象进行了绑定,当数据对象发生变化时,控件会自动更新显示内容。 在使用 DataTemplate 时,我们可以将其应用到不同的控件中,例如 ListBox、ComboBox 等。在控件中,我们可以通过设置 ItemTemplate 属性来应用 DataTemplate,用于显示数据对象的内容。例如: ```xml <ListBox ItemsSource="{Binding People}" ItemTemplate="{StaticResource PersonTemplate}"/> ``` 在上面的代码中,我们将 ListBox 的 ItemsSource 属性绑定到一个 People 集合上,然后使用 StaticResource 引用了上面定义的 PersonTemplate,用于显示集合中的每个 Person 对象。当 ListBox 显示时,每个 Person 对象都会使用 PersonTemplate 中定义的方式进行显示。这样,我们就可以快速、方便地实现了数据的绑定和显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值