我尝试过在TreeView中使用模板选择器(请参阅此项目:https://github.com/imekon/AvaloniaTreeViewTemplate)
它创建了一个树,但节点不再有箭头,以允许我看到子节点。
这是我使用的XAML:
<TreeView Items="{Binding Things}">
<TreeView.Items>
<scg:List x:TypeArguments="vm:ThingViewModel">
<vm:ThingViewModel Template="Folder"/>
<vm:ThingViewModel Template="Thing"/>
</scg:List>
</TreeView.Items>
<TreeView.DataTemplates>
<helpers:ThingTemplateSelector>
<TreeDataTemplate x:Key="Folder" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}"/>
</TreeDataTemplate>
<TreeDataTemplate x:Key="Thing">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Address}"/>
</StackPanel>
</TreeDataTemplate>
</helpers:ThingTemplateSelector>
</TreeView.DataTemplates>
</TreeView>
这是选择器:
public class ThingTemplateSelector : IDataTemplate
{
public bool SupportsRecycling => false;
[Content]
public Dictionary<string, IDataTemplate> Templates { get; } = new Dictionary<string, IDataTemplate>();
public IControl Build(object data)
{
return Templates[((ThingViewModel)data).Template].Build(data);
}
public bool Match(object data)
{
return data is ThingViewModel;
}
}
如果我使用一个简单的TreeDataTemplate,我可以让一个树视图工作,但是我不能让它为条目类型(“事物”或“文件夹”)选择正确的模板。所有节点都是一种类型。
现在的阿瓦隆尼亚能做到吗?
上图显示了“Thing”节点,但旁边没有箭头。单击它只会选择项目,但不能展开它以查看子节点。
1条答案
按热度按时间ehxuflar1#
我最终通过让选择器实现
ITreeDataTemplate
而不是IDataTemplate
来实现这一点。这让我有机会动态调用正确的ItemsSelector:使用以下Xaml: