c# - 通过属性设置 Treeview HierarchicalDataTemplate

标签 c# wpf user-controls treeview dependency-properties

这个有点复杂。我正在尝试创建一个具有 TreeView 和一些其他控件的用户控件,以创建对其他实现有用的可重用控件。

我遇到的问题是我不知道如何将在控件外部定义的 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}}">

在 TreeView 的其他实现中,我通常会以类似于此的方式使用 HierarchicalDataTemplate。

<TreeView.Resources>
    <HierarchicalDataTemplate ItemsSource="{Binding Children}">
        <TextBlock Text="Hello"/>
    </HierarchicalDataTemplate>
</TreeView.Resources>

但是,由于 HierarchicalDataTemplate 位于依赖属性内,我需要以某种方式将它绑定(bind)到 Treeview 中。我已经浏览了互联网(并将继续这样做),但找不到任何相关内容。

如何将包含 HierarchicalDataTemplate 的依赖属性注入(inject)到 TreeView 中?

最佳答案

以下应该有效:

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

关于c# - 通过属性设置 Treeview HierarchicalDataTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39851075/

相关文章:

c# - 确定何时以及在文本框中添加或删除哪个字符

wpf - 风格错误?无法在Windows10中设置样式内的背景颜色

c# - 如何以编程方式访问 ContentTemplate 中定义的元素?

C++ 提示用户继续或离开

C# 在 Visual Studio 中从自动生成的 Reference.cs 获取 XML SOAP 响应

c# - 在 Windows 8 商店 C# 应用程序 : The base class or interface could not be resolved 中使用 WSDL Web 服务

javascript - 将 html 表中的输入文本动态传递给 Javascript 函数

wpf - wpf自定义控件库和wpf类库有什么区别

c# - 在 WPF 中,如何在设计 View 中将样式应用于 UserControl?

java - 从 Java 应用程序调用 C# 库 : Process is terminated due to StackOverflowException