【问题标题】:set Treeview HierarchicalDataTemplate via a property通过属性设置 Treeview HierarchicalDataTemplate
【发布时间】:2017-02-12 13:08:10
【问题描述】:

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

我遇到的问题是我无法弄清楚如何将在控件外部定义的 HierarchicalDataTemplate 插入到控件内部的树视图中。

这里的控件外面是我的 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 的依赖属性注入到树视图中?

【问题讨论】:

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


    【解决方案1】:

    以下应该可以工作:

    1. PropertyChangedCallback 添加到您的HierarchicalDataTemplateProperty
    2. 在handler中,添加模板来控制资源:

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

    【讨论】:

    • 这样排序了。谢谢。
    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多