通过属性设置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的依赖属性注入到树视图中?

通过属性设置Treeview HierarchicalDataTemplate

以下内容可以:

  1. PropertyChangedCallback添加到HierarchicalDataTemplateProperty中。
  2. 在处理程序中,添加模板来控制资源:

    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设置为您的模板类型。您应该以某种方式(验证等)强制执行