典型的,把模板关联到一块特定的数据上,不过通常希望动态的确定使用哪个模板---既可以基于一个属 性值,也可以是一个全局状态。当真正需要大规模替换模板时,也可以使用DataTemplateSelector。
DataTemplateSelector提供了一个单一的方法----SelectTemplate,以允许通过执行任何逻辑来决定 使用哪个模板。可以在被包含的元素中查找模板,并返回一些硬编码的模板,甚至动态的为每个条目创建模板 。
首先,创建一个继承自DataTemplateSelector的类,并完成一些在几个模板中进行旋转的逻辑。在 这个例子中,将找到XmlElement的LocalName,并从容器中获取具有该名称的资源,代码如下:
public class LocalNameTemplateSelector : DataTemplateSelector { public override DataTemplate SelectTemplate (object item,DependencyObject container) { XmlElement data = item as XmlElement; if (data != null) { return ((FrameworkElement)container).FindResource(data.LocalName) as DataTemplate; } return null; } }
为了初始化所有的模板,将构建三个模板:用于书籍的棕色矩形,用于CD的银色圆形以及用于 DVD的蓝色圆形。由于模板选择器将查找XmlElement的本地名称,所以需要为每个模板设置X:Key,代码如下:
<DataTemplate x:Key="Book" DataType="{x:Type sx:XmlElement}"> <StackPanel Orientation="Horizontal"> <Rectangle Margin="2" Width="14" Height="14" Fill="Brown"/> <TextBlock VerticalAlignment="Center" Text="{Binding XPath=@Title}"></TextBlock> </StackPanel> </DataTemplate> <DataTemplate x:Key="CD" DataType="{x:Type sx:XmlElement}"> <StackPanel Orientation="Horizontal"> <Ellipse Margin="2" Width="14" Height="14" Fill="Silver"/> <TextBlock VerticalAlignment="Center" Text="{Binding XPath=@Title}"></TextBlock> </StackPanel> </DataTemplate> <DataTemplate x:Key="DVD" DataType="{x:Type sx:XmlElement}"> <StackPanel Orientation="Horizontal"> <Ellipse Margin="2" Width="14" Height="14" Fill="Blue"/> <TextBlock VerticalAlignment="Center" Text="{Binding XPath=@Title}"></TextBlock> </StackPanel> </DataTemplate>
余下的就是把模板选择器和ListBox进行关联,而不是设置静态模板 ,代码如下:
<ListBox ItemsSource="{Binding XPath=/Media/*}"> <ListBox.ItemTemplateSelector> <l:LocalNameTemplateSelector xmlns:l="clr-namespace:WpfProgressBarDemo"/> </ListBox.ItemTemplateSelector> </ListBox>
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索模板
, 代码
, 选择
, xmlelement
, 圆形
, selecttemplate用户名密码
, 一个
WPF模板
wpf 模板选择器、wpf 数据模板选择器、wpf 带图片的按钮模板、wpf 模板、wpf 控件模板,以便于您获取更多的相关知识。