我有一个自包含引用数据的树,这个数据绑定到树的层次转换器MVVM WPF应用程序。 (如实施例中: http://www.telerik.com/help/wpf/radtreeview-how-to-bind-to-self-referencing-data.html )
此数据包括ID,PARENTID,文本和类型(和更多)。
实施例的数据:
1,0,"FirstItem","Triangle"
2,1,"SubItem1","Circle"
3,1,"SubItem2","Square"
4,2,"SubItem11","Triangle"
5,2,"SubItem12","Heart"
6,3,"SubItem21","Circle"
现在,我想有三角形,心,圆形和正方形不同的模板。 我不意味只改变一个图片,但真正的模板。 我怎么能做到这样?
亲切的问候,保罗。
如果你ItemsSource
是由不同的类型,那么你可以简单地创建HierarchicalDataTemplates
而不是分配X:关键。 如果没有X:一键属性DataTemplate
,该框架将使用此DataTemplate
,当它遇到的类型,并试图直观地显示它(你可以阅读更多关于隐含DataTemplates
这里 )。 例如,如果你有一个Circle类型和另一种类型的广场,你将有以下模板在你的资源:
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Circle}" ItemsSource="{Binding Children}">
<Ellipse Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Square}" ItemsSource="{Binding Children}">
<Rectangle Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
</Window.Resources>
然后,如果您TreeView
遇到在这些类型之一ItemsSource
,它将使用HierarchicalDataTemplate
为特定的类型。
你可以阅读更多关于HierarchicalDataTemplates
这里 ,并且这种联系具有它们是如何在一个使用的例子TreeView
。
要么
如果您的项目都是相同的类型,并且只能由一个属性(如Type)有区别的,你需要使用一个DataTemplateSelector
。 下面是一个简单的例子:
代码隐藏:
public class ShapeTemplateSelector : DataTemplateSelector
{
public DataTemplate CircleTemplate { get; set; }
public DataTemplate SquareTemplate { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
Shape shape = item as Shape;
if (shape != null)
{
if (shape.Type == "Circle")
return this.CircleTemplate;
else if (shape.Type == "Square")
return this.SquareTemplate;
}
return null;
}
}
和XAML:
<local:ShapeTemplateSelector x:Key="shapeSelector">
<local:ShapeTemplateSelector.CircleTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Shape}" ItemsSource="{Binding Children}">
<Ellipse Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
</local:ShapeTemplateSelector.CircleTemplate>
<local:ShapeTemplateSelector.SquareTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Shape}" ItemsSource="{Binding Children}">
<Rectangle Fill="{Binding Fill}" Width="25" Height="25" Stroke="Black" StrokeThickness="0.25"/>
</HierarchicalDataTemplate>
</local:ShapeTemplateSelector.SquareTemplate>
</local:ShapeTemplateSelector>
然后在你TreeView
,你只要将选择
<TreeView x:Name="Tree" ItemsSource="{Binding Shapes}" ItemTemplateSelector="{DynamicResource shapeSelector}"/>
如果你有实际的不同类型,你可以使用数据类型属性在HierarchicalDataTemplate指定类型( 如何使用一个WPF DataTemplate中?数据类型属性 )和WPF将选择基于类的模板。
如果没有不同的类型,但将取决于类中的属性或值,你需要指定一个DataTemplateSelector( http://tech.pro/tutorial/807/wpf-tutorial-how-to-使用-A-datatemplateselector )