2015-10-05 85 views
0

我有一个TreeView说我绑定到一个观察的集合,它有它内部的两个可观察集合:WPF树视图与多种类型的子节点

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属性和Items属性,但我无法弄清楚如何在RecallNum下显示解释作为附加子节点。

理想的情况下,它会是这个样子:

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

我试过HierarchicalDataTemplate in TreeView.Resources,但我只是没有做正确的事情。绑定是我一直困难的时刻,我的头绕过。

回答

1

我不知道这是否会在环境中工作,而现在我不能尝试,但怎么样......

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

或者类似的规定?

编辑: 据了解,我们希望有一个TreeView有两种类型的项目(对不起,这是C#,但我相信你可以翻译)。

您可以尝试制作一个基类,从中派生ocSpecialPoliciesItem和ocSpecialPoliciesExplain,并创建一个可观察的基类集合。然后在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> 

我有这样的事情的工作,但不是一个TreeView。我使用了一个空的抽象ViewBase类以及几个具体的View类。我的ViewModel有一个名为CurrentView的属性,类型为ViewBase,每个具体视图都有一个DataTemplate。我的XAML为CurrentView的任何派生类挑选出正确的DataTemplate

+0

老实说,我不知道该怎么做......你会在我的半工作例子中看到,我将TreeView2绑定到SpecialPolicies ObservableCollection属性,然后绑定到Item Property的HierarchicalDataTemplate。这是我能够实现它的唯一途径。我想我需要将SpecialPolicies.RecallNum从HierarchicalDataTemplate中取出来,这样我可以嵌套子项目,但不知道如何。我真的希望有一种方法可以在UI视图中查看/调试数据绑定,因为现在我觉得我只是在黑暗中猜测和磕磕绊绊。 – AndyD273

+0

啊,重新阅读,无论如何我可能会误解。我想你想在层次结构的一个层次上显示ocSpecialPoliciesItem,然后ocSpecialPoliciesExplain更深一层。每个项目都有 - 解释? – PScr

+0

不是每一个。而且,随着数据表的建立,说明和项目没有明确的联系,因为可以在没有项目的情况下进行解释(这可能是对特殊政策本身的解释,而不是对项目的解释......)。简短的版本,我必须把他们当作两种不同的儿童类型的SpecialPolicy,而不是孩子/孙子...... – AndyD273