如果把控件的功能视为内容,则可以使用控件模板 ControlTemplate 来控制它的展现;

如果把数据视为内容,则可以使用数据模板 DataTemplate 把数据展示出来;

ControlTemplate 是算法内容的表现形式,一个控件怎样组织其内部结构才让它更符合业务逻辑、让用户操作起来更舒服就是由它来控制的;

DataTemplate 是数据内容的表现形式,一条数据是简单的文本还是图形动画还是其他,由它决定。

1. DataTemplate

1.1 一条柱状图的 DataTemplate 举例

<DataTemplate x:Key="dt">
<Grid>
<StackPanel Orientation="Horizontal">
<Grid>
<Rectangle Width="{Binding Price}" Fill="LightSalmon"/>
<TextBlock Text="{Binding Year}"></TextBlock>
</Grid>
<TextBlock Text="{Binding Price}"></TextBlock>
</StackPanel>
</Grid>
</DataTemplate>

1.2 常用 DataTemplate 的 3 处地方

ContentControl 的 ContentTemplate 属性,给 ContentControl 的内容穿衣服;

ItemsControl 的 ItemTemplate 属性,给 ItemsControl 的数据条目穿衣服;

GridViewColumn 的 CellTemplate 属性,给 GridViewColumn 单元格里的数据穿衣服。

1.3 使用 DataTemplate 实现一个汽车列表和详情

<Window x:Class="WpfAppTemplate.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:WpfAppTemplate"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="623">
<Window.Resources>
<local:NameToPhotoPathConverter x:Key="nameToPhotoPathConverter"/> <!--集合条目的内容模板-->
<DataTemplate x:Key="carListItemViewTemplate">
<Grid Margin="2">
<StackPanel Orientation="Horizontal">
<Image Height="60" Width="64"
Source="{Binding Name, Converter={StaticResource nameToPhotoPathConverter}}" />
<StackPanel Margin="5 12">
<TextBlock Text="Name" FontWeight="Bold"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</StackPanel>
</Grid>
</DataTemplate> <!--详情的内容模板-->
<DataTemplate x:Key="carDetailViewTemplate">
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="6" Margin="2">
<StackPanel Margin="5">
<Image Height="250" Width="400"
Source="{Binding Name, Converter={StaticResource nameToPhotoPathConverter}}" />
<StackPanel Orientation="Horizontal" Margin="5,0">
<TextBlock Text="Name:" FontWeight="Bold" FontSize="19"/>
<TextBlock Text="{Binding Name}" FontSize="19"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5 0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Year:" FontWeight="Bold"/>
<TextBlock Text="{Binding Year}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5 0">
<TextBlock Text="TopSpeed:" FontWeight="Bold"/>
<TextBlock Text="{Binding TopSpeed}"/>
</StackPanel>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
</Window.Resources> <Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions> <UserControl x:Name="carDetailControl"
ContentTemplate="{StaticResource carDetailViewTemplate}"
Content="{Binding ElementName=listBoxCar, Path=SelectedItem}" /> <ListBox Grid.Column="1" x:Name="listBoxCar" Margin="2"
ItemTemplate="{StaticResource carListItemViewTemplate}" />
</Grid>
</Window> public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InitializeList();
} /// <summary>
/// 添加汽车种类
/// </summary>
void InitializeList()
{
List<Car> carList = new List<Car>();
carList.Add(new Car() { Name = "BMW", TopSpeed = "260", Year = "1997" });
carList.Add(new Car() { Name = "Audi", TopSpeed = "240", Year = "1999" });
carList.Add(new Car() { Name = "Toyota", TopSpeed = "120", Year = "2016" });
carList.Add(new Car() { Name = "Volkswagen", TopSpeed = "150", Year = "2000" }); this.listBoxCar.ItemsSource = carList;
}
}

1.4 而如果不用 DataTemplate ,就会显得比较繁琐且冗长

使用 winform 的 Usercontrol 实现一个汽车列表和详情

<!--汽车详情-->
<UserControl x:Class="WpfAppTemplate.UserControls.CarDetailUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfAppTemplate.UserControls"
mc:Ignorable="d" >
<Border BorderBrush="Black" BorderThickness="1" CornerRadius="6" Margin="2">
<StackPanel Margin="5">
<Image x:Name="img" Height="250" Width="400"/> <StackPanel Orientation="Horizontal" Margin="5,0">
<TextBlock Text="Name:" FontWeight="Bold" FontSize="19"/>
<TextBlock x:Name="textBlockName" FontSize="19"/>
</StackPanel> <StackPanel Orientation="Horizontal" Margin="5 0">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Year:" FontWeight="Bold"/>
<TextBlock x:Name="textBlockYear"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="5 0">
<TextBlock Text="TopSpeed:" FontWeight="Bold"/>
<TextBlock x:Name="textBlockTopSpeed"/>
</StackPanel>
</StackPanel> </StackPanel>
</Border>
</UserControl> public partial class CarDetailUserControl : UserControl
{
public CarDetailUserControl()
{
InitializeComponent();
} Car _currentCar;
public Car CurrentCar
{
get { return _currentCar; }
set
{
if (value == null) return;
_currentCar = value;
this.textBlockName.Text = value.Name;
this.textBlockTopSpeed.Text = value.TopSpeed;
this.textBlockYear.Text = value.Year;
string uriStr = string.Format(@"/Resources/Images/Cars/{0}.jpg", value.Name);
this.img.Source = new BitmapImage(new Uri(uriStr, UriKind.Relative));
}
}
} <!--汽车条目-->
<UserControl x:Class="WpfAppTemplate.UserControls.CarListItemUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfAppTemplate.UserControls"
mc:Ignorable="d">
<Grid Margin="2">
<StackPanel Orientation="Horizontal">
<Image x:Name="img" Height="60" Width="64"/>
<StackPanel Margin="5 12">
<TextBlock Text="Name" FontWeight="Bold"/>
<TextBlock x:Name="textBlockName" />
</StackPanel>
</StackPanel>
</Grid>
</UserControl> public partial class CarListItemUserControl : UserControl
{
public CarListItemUserControl()
{
InitializeComponent();
} Car _currentCar;
public Car CurrentCar
{
get { return _currentCar; }
set
{
if (value == null) return; _currentCar = value;
this.textBlockName.Text = value.Name;
string uriStr = string.Format(@"/Resources/Images/Cars/{0}.jpg", value.Name);
this.img.Source = new BitmapImage(new Uri(uriStr, UriKind.Relative));
}
}
} <!--主窗体-->
<Window x:Class="WpfAppTemplate.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:WpfAppTemplate"
xmlns:localUserControls="clr-namespace:WpfAppTemplate.UserControls"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="623">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"/>
<ColumnDefinition Width="2*"/>
</Grid.ColumnDefinitions> <localUserControls:CarDetailUserControl x:Name="carDetailControl"/> <ListBox Grid.Column="1" x:Name="listBoxCar" SelectionChanged="listBoxCar_SelectionChanged" Margin="2"/>
</Grid>
</Window> public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InitializeList();
} /// <summary>
/// 添加汽车种类
/// </summary>
void InitializeList()
{
List<Car> carList = new List<Car>();
carList.Add(new Car() { Name = "BMW", TopSpeed = "260", Year = "1997" });
carList.Add(new Car() { Name = "Audi", TopSpeed = "240", Year = "1999" });
carList.Add(new Car() { Name = "Toyota", TopSpeed = "120", Year = "2016" });
carList.Add(new Car() { Name = "Volkswagen", TopSpeed = "150", Year = "2000" }); // 给每种汽车生成一个 汽车条目控件,作为一条内容添加到汽车列表控件的内容集合
foreach (Car car in carList)
{
CarListItemUserControl control = new CarListItemUserControl();
control.CurrentCar = car;
this.listBoxCar.Items.Add(control);
}
} /// <summary>
/// 当切换汽车时
/// </summary>
/// <param name="sender">listbox</param>
/// <param name="e">SelectionChangedEventArgs, 可以通过 AddedItems 参数取到新选择的项</param>
private void listBoxCar_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
CarListItemUserControl control = e.AddedItems[0] as CarListItemUserControl;
if (control != null)
{
this.carDetailControl.CurrentCar = control.CurrentCar;
}
}
}

WPF 基础 - DataTemplate的更多相关文章

  1. WPF 基础 - DataTemplate 和 ControlTemplate 的关系和应用

    1. 关系 凡是 Template,最后都得作用到 控件 上,这个控件就是 Template 的目标控件(也称模板化控件): DataTemplate 一般是落实在一个 ContentPresente ...

  2. WPF基础到企业应用系列6——布局全接触

    本文转自:http://knightswarrior.blog.51cto.com/1792698/365351 一. 摘要 首先很高兴这个系列能得到大家的关注和支持,这段时间一直在研究Windows ...

  3. WPF 基础到企业应用系列索引

    转自:http://www.cnblogs.com/zenghongliang/archive/2010/07/09/1774141.html WPF 基础到企业应用系列索引 WPF 基础到企业应用系 ...

  4. WPF笔记(1.1 WPF基础)——Hello,WPF!

    原文:WPF笔记(1.1 WPF基础)--Hello,WPF! Example 1-1. Minimal C# WPF application// MyApp.csusing System;using ...

  5. WPF 遍历DataTemplate(获取所有控件)

    原文:WPF 遍历DataTemplate(获取所有控件) 情况1:在设定DataTemplate的Name,并且他是在前台表示时,获取DataTemplate里的指定控件. 方法: http://b ...

  6. C# WPF基础巩固

    时间如流水,只能流去不流回. 学历代表你的过去,能力代表你的现在,学习能力代表你的将来. 学无止境,精益求精. 一.写作目的 做C# WPF开发,无论是工作中即将使用,还是只应付跳槽面试,开发基础是非 ...

  7. WPF基础知识、界面布局及控件Binding(转)

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  8. WPF基础知识、界面布局及控件Binding

    WPF是和WinForm对应的,而其核心是数据驱动事件,在开发中显示的是UI界面和逻辑关系相分离的一种开放语言.UI界面是在XAML语言环境下开发人员可以进行一些自主设计的前台界面,逻辑关系还是基于c ...

  9. wpf ListView DataTemplate方式的鼠标悬停和选中更改背景色

    今天使用wpf技术弄一个ListView的时候,由于需求需要,需要ListView显示不同的数据模板,很自然的使用了DataTemplate方式来定义多个数据模板,并在ListView中使用ItemT ...

随机推荐

  1. [Golang]-3 函数、多返回值、变参、闭包、递归

    // test01 project main.go package main import ( "fmt" ) // 单返回值的函数 func plus(a int, b int) ...

  2. 实战交付一套dubbo微服务到k8s集群(1)之Zookeeper部署

    基础架构 主机名 角色 IP地址 mfyxw10.mfyxw.com K8S代理节点1,zk1 192.168.80.10 mfyxw20.mfyxw.com K8S代理节点2,zk2 192.168 ...

  3. Linux命令学习-01——find -type

    Linux find 命令用来在指定目录下查找文件. 任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件.并且将查找到 ...

  4. C# 类 (11) - Const

    Const variable 变量 ,值可变的constant 常量,不可变,C# 里关键字是const当我们定义一个常量的时候,需要立马赋值,以后不能再改这个量了我们可以把常量定义在 method ...

  5. Makefile 流程控制(error,warning)等调试选项

    1.退出码 0 ok1 错误2 使用了-q 选项 且目标不需要更新 返回2 2.选项 -f --file 指定makefile脚本 -n --just-print --dry -run -- reco ...

  6. CSON vs JSON

    CSON vs JSON 今天在github浏览资料时,无意发现了这个很像json,却优于json的cson.故,再次分享给大家! 官方fork文档:https://github.com/xgqfrm ...

  7. Mac 外接 Dell 4K 显示器字体模糊解决办法

    Mac 外接 Dell 4K 显示器字体模糊解决办法 mac mini mbp 2020 refs https://zhuanlan.zhihu.com/p/52100804 xgqfrms 2012 ...

  8. JavaScript string repeat methods All In One

    JavaScript string repeat methods All In One There are many ways in the ES-Next ways repeat ES2015 / ...

  9. OLAP

    OLAP Online Analytical Processing https://en.wikipedia.org/wiki/Online_analytical_processing 在线分析处理 ...

  10. Vue SSR in Action

    Vue SSR in Action https://ssr.vuejs.org/ https://ssr.vuejs.org/api/ https://ssr.vuejs.org/guide/data ...