WPF Template模版之DataTemplate与ControlTemplate
1.DataTemplate与ControlTemplate的关系
- 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是个数据和行为的载体、是个抽象的概念,至于它本身会长成什么样子(控件内部结构)、它的数据会长成什么样子(数据显示结构)都是靠Template生成的。决定控件外观的是ControlTemplate,决定数据外观的是DataTemplate,它们正是Control类的Template和ContentTemplate两个属性的值。它们的作用范围如图1所示。

图1
- 凡是Template,最终都是要作用在控件上的,这个控件就是Template的目标控件,也叫模板化控件(Templated Control)。你可能会问:“DataTemplate的目标应该是数据呀,怎么会是控件?”DataTemplate给人的感觉的确是施加在了数据对象上,但施加在数据对象上生成的一组控件总得有个载体吧?这个载体一般是落实在一个ContentPresenter对象上。ContentPresenter类只有ContentTemplate属性、没有Template属性,这就证明了承载由DataTemplate生成的一组控件是它的专门用途。
- 至此我们可以看出,由ControlTemplate生成的控件树其树根就是ControlTemplate的目标控件,此模板化控件的Template属性值就是这个ControlTemplate实例;与之相仿,由DataTemplate生成的控件树其树根是一个ContentPresenter控件,此模板化控件的ContentTemplate属性值就是这个DataTemplate实例。因为ContentPresenter控件是ControlTemplate控件树上的一个结点,所以DataTemplate控件树是ControlTemplate控件树的一棵子树。它们的关系如图2所示。
-
ContentPresenter 通常用在 ControlTemplate 中,作为一个占位符来表示“将实际内容放在这里”。
-
ContentControl 可以在任何地方使用,不一定在模板中使用。 它将获取为分配给它的内容类型定义的任何 DataTemplate
-

图2

浙公网安备 33010602011771号