2015-10-05 82 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