我有一个 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"
Run Code Online (Sandbox Code Playgroud)
现在我想要三角形、心形、圆形和正方形的不同模板。我的意思不仅仅是更改图像,而是更改模板。我怎样才能做到这一点?
亲切的问候,保罗。
如果您的ItemsSource类型由不同的类型组成,那么您可以简单地创建HierarchicalDataTemplates而不分配 x:Key。如果 a 没有 x:Key 属性DataTemplate,框架将DataTemplate在遇到该类型时使用该属性并尝试直观地显示它(您可以DataTemplates 在此处阅读有关隐式的更多信息)。例如,如果您有一个“圆形”类型和另一个“方形”类型,则资源中将包含以下模板:
<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>
Run Code Online (Sandbox Code Playgroud)
然后,如果您TreeView在其中遇到这些类型之一ItemsSource,它将使用HierarchicalDataTemplate该特定类型。
HierarchicalDataTemplates 您可以在此处阅读更多相关信息,并且此链接提供了如何在TreeView.
或者
如果您的项目都是相同的类型,并且仅通过属性(例如类型)进行区分,则您需要使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
和 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>
Run Code Online (Sandbox Code Playgroud)
然后在您的 中TreeView,您只需分配选择器
<TreeView x:Name="Tree" ItemsSource="{Binding Shapes}" ItemTemplateSelector="{DynamicResource shapeSelector}"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2399 次 |
| 最近记录: |