具有多种类型子节点的 WPF 树视图

WPF treeview with multiple types of child nodes

我有一个绑定到可观察集合的 TreeView,其中有两个可观察集合:

Public Class ocSpecialPolicies
    Implements INotifyPropertyChanged
    Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    Protected Overridable Sub OnPropertyChanged(ByVal Propertyname As String)
        If Not Propertyname.Contains("Changed") Then
            Changed = True
        End If
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(Propertyname))
    End Sub

    Private _changed As Boolean
    Public Property Changed() As Boolean
        Get
            Return _changed
        End Get
        Set(ByVal value As Boolean)
            If _changed <> value Then
                _changed = value
                OnPropertyChanged("Changed")
            End If
        End Set
    End Property

    Public Property Items As New ObservableCollection(Of ocSpecialPoliciesItem)
    Public Property Explanations As New ObservableCollection(Of ocSpecialPoliciesExplain)

    Private _RecallNum As String
    Public Property RecallNum As String
        Get
            Return _RecallNum
        End Get
        Set(value As String)
            If _RecallNum <> value Then
                _RecallNum = value
                OnPropertyChanged("RecallNum")
            End If
        End Set
    End Property
End Class

我已经完成一半了:

<TreeView Name="TreeView2" Margin="3" ItemsSource="{Binding ElementName=MainWindow, Path=SpecialPolicies, UpdateSourceTrigger=PropertyChanged}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Items, UpdateSourceTrigger=PropertyChanged}">
            <TextBlock Text="{Binding Path=RecallNum}" >
            </TextBlock>
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=LaborOp}" >
                    </TextBlock>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

我可以在其中看到 RecallNum 属性 和项目 属性,但我无法弄清楚如何将 Explanations 也显示为 RecallNum 下的附加子节点。

理想情况下,它看起来像这样:

RecallNum*
    Items
        LaborOp
        LaborOp
        LaborOp**
    Explanations
        *ExplanationText
        **ExplanationText

我试过 HierarchicalDataTemplate in TreeView.Resources,但我只是做错了什么。绑定是我一直难以理解的事情。

我不知道这是否适用于上下文,我现在不能尝试,但是...

        <HierarchicalDataTemplate.ItemTemplate>
            <DataTemplate TargetType="{x:Type=ocSpecialPoliciesItem}">
              ...
            </DataTemplate>
            <DataTemplate TargetType="{x:Type=ocSpecialPoliciesExplain}">
              ...
            </DataTemplate>
        </HierarchicalDataTemplate.ItemTemplate>

或者类似的东西?

编辑: 理解我们想要一个具有两种项目的 TreeView(抱歉,这是 C#,但我相信你可以翻译)。

您可以尝试创建一个基础 class,从中您可以派生 ocSpecialPoliciesItem 和 ocSpecialPoliciesExplain,并创建基础 class 的可观察集合。然后在你的 TreeView.

中使用两个 DataTemplates
class SpecialPoliciesBase {}

class ocSpecialPoliciesItem : SpecialPoliciesBase 
{ ... }

class ocSpecialPoliciesExplain : SpecialPoliciesBase
{ ... }

class ocSpecialPolicies
{
     // this is where you put ocSpecialPoliciesItem  and 
     // ocSpecialPoliciesExplain
     // I do not see any code for populating your two collections, 
     // but I suppose you must have some somewhere
   public ObersvableCollection<SpecialPoliciesBase> SPCollection
   { get ... }
}

在你的XAML

<TreeView 
  Name="TreeView2" 
  Margin="3" 
  ItemsSource="{
    Binding ElementName=MainWindow, 
    Path=SPCollection, 
    UpdateSourceTrigger=PropertyChanged}">

  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate ...>
       <TextBlock Text="{Binding Path=RecallNum}" />

       <HierarchicalDataTemplate.ItemTemplate>
           <DataTemplate TargetType={x:Type ocSpecialPoliciesItem} > 
               <!- this is where you put the template for Item !->
           </DataTemplate>
           <DataTemplate TargetType={x:Type: ocSpecialPoliciesExplain} > 
               <!- this is where you put the template for Explanations !->
           </DataTemplate>
        </HierarchicalDataTemplate.ItemTemplate>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>

我有类似的东西可以工作,但不能用于树视图。我使用一个空的抽象 ViewBase class,带有几个具体的 View classes。我的 ViewModel 有一个名为 CurrentView 的 属性,类型为 ViewBase,每个具体视图都有一个 DataTemplate。我的 XAML 为派生的 class CurrentView 选择了正确的 DataTemplate