通过属性设置Treeview HierarchicalDataTemplate
本文关键字:Treeview HierarchicalDataTemplate 设置 属性 | 更新日期: 2023-09-27 18:11:22
这个有点复杂。我试图创建一个用户控件,它有一个树视图和其他一些控件,创建一个可重用的控件,将是有用的其他实现。
我遇到的问题是,我无法弄清楚如何插入在控件外部定义的HierarchicalDataTemplate到控件内部的treeview
在控制之外这里是我的WPF
<Grid>
<Grid.Resources>
<HierarchicalDataTemplate x:Key="HierarchicalDataTemplate" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
</Grid.Resources>
<masterTreeUserControl:MasterTreeUserControl
HierarchicalDataTemplate="{StaticResource HierarchicalDataTemplate}"
ItemsSource="{Binding Path=SelectiveListViewModel.Items, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=SelectiveListViewModel.SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
EnableAdd="False"
ItemType="{x:Type viewmodels:LocationItem}"
/>
</Grid>
MasterTreeUserControl有一个HierarchicalDataTemplate DependencyProperty
HierarchicalDataTemplateProperty = DependencyProperty.Register("HierarchicalDataTemplate",typeof(HierarchicalDataTemplate),typeof(MasterTreeUserControl));
private static readonly DependencyProperty HierarchicalDataTemplateProperty;
public HierarchicalDataTemplate HierarchicalDataTemplate
{
get
{
return (HierarchicalDataTemplate)GetValue(HierarchicalDataTemplateProperty);
}
set
{
SetValue(HierarchicalDataTemplateProperty, value);
}
}
到目前为止,控件内部的Treeview是这样的
<TreeView Name="ItemListView"
Grid.Row="2"
Margin="0,5,0,0"
ItemsSource="{Binding Source={StaticResource ItemsCvs}}">
在树视图的其他实现中,我通常会以类似的方式做HierarchicalDataTemplate。
<TreeView.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="Hello"/>
</HierarchicalDataTemplate>
</TreeView.Resources>
然而,由于HierarchicalDataTemplate在依赖属性中,我需要以某种方式将它绑定到Treeview中。我已经在网上浏览了一遍(我将继续这样做),但找不到任何相关的东西。
如何将包含HierarchicalDataTemplate的依赖属性注入到树视图中?
以下内容可以:
- 将
PropertyChangedCallback
添加到HierarchicalDataTemplateProperty
中。 -
在处理程序中,添加模板来控制资源:
private static void OnTemplateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var This = d as MasterTreeUserControl; var template = e.NewValue as HierarchicalDataTemplate; if(template != null) { This.ItemListView.Resources[new DataTemplateKey(template.DataType)] = template; } }
唯一的问题是,您的HierarchicalDataTemplate
必须有DataType
设置为您的模板类型。您应该以某种方式(验证等)强制执行