0

原諒我的英文不好,希望能解釋清楚。 我無法在Treview(SL4)中看到子節點。 我有這種情況:Silverlight - TreeView和HierarchialDataTemplate

2類:

Public Class My_Root 
    Private My_Cod_Prod As String 
    Public Property Cod_Prod() As String 
     Get 
      Return My_Cod_Prod 
     End Get 
     Set(ByVal value As String) 
      My_Cod_Prod = value 
     End Set 
    End Property 

    Private My_Desc_Prod As String 
    Public Property Desc_Prod() As String 
     Get 
      Return My_Desc_Prod 
     End Get 
     Set(ByVal value As String) 
      My_Desc_Prod = value 
     End Set 
    End Property 

    Private My_Cod_Desc_Prod As String 
    Public Property Cod_Desc_Prod() As String 
     Get 
      Return My_Cod_Desc_Prod 
     End Get 
     Set(ByVal value As String) 
      My_Cod_Desc_Prod = value 
     End Set 
    End Property 

    Private My_Items As New My_Child 
    Public Property Items() As My_Child 
     Get 
      Return My_Items 
     End Get 
     Set(ByVal value As My_Child) 
      My_Items = value 
     End Set 
    End Property 


End Class 



Public Class My_Child 
    Implements INotifyPropertyChanged 
    Dim Selezionato As Boolean = False 
    Private My_Cod_PosFis As String 
    Public Property Cod_PosFis() As String 
     Get 
      Return My_Cod_PosFis 
     End Get 
     Set(ByVal value As String) 
      My_Cod_PosFis = value 
     End Set 
    End Property 
    Private My_Desc_PosFis As String 
    Public Property Desc_PosFis() As String 
     Get 
      Return My_Desc_PosFis 
     End Get 
     Set(ByVal value As String) 
      My_Desc_PosFis = value 
     End Set 
    End Property 

    Public Property Selezione 
     Get 
      Return Selezionato 
     End Get 
     Set(ByVal value) 
      Selezionato = value 
      NotifyPropertyChanged("Selezione") 
     End Set 
    End Property 

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged 
    Public Sub NotifyPropertyChanged(ByVal propertyName As String) 
     RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) 
    End Sub 


End Class 

然後,我創建一個ObservableCollection:

Public Shared nodi As New ObservableCollection(Of My_Root)() 

,人這一方式:

Private Sub Compila_Class_My_Root() 
    For Each Prod In Elenco_ASS_Prodotti_PosFiscali 
       Dim NodoRoot As New My_Root 

        NodoRoot.Cod_Prod = Prod.PFIS_CODPROD 
        NodoRoot.Desc_Prod = Prod.PFIS_DESCOM 
        NodoRoot.Cod_Desc_Prod = Prod.PFIS_CODPROD & " - " & Prod.PFIS_DESCOM 
       Dim NodoChild As New My_Child 
        NodoChild.Cod_PosFis = Prod.PFIS_POSFIS 
        Dim desc_pos_fis As String = get_DescrizionePosFis(Prod.PFIS_POSFIS) 
        NodoChild.Desc_PosFis = desc_pos_fis 
        NodoRoot.Items = NodoChild 
       nodi.Add(NodoRoot) 
    Next 

    MyTreeView.ItemsSource = nodi 

End Sub 

這是一片XAML到HierarchicalDataTemplate:

 <sdk:HierarchicalDataTemplate x:Key="MyNodeRoot"> 
      <sdk:HierarchicalDataTemplate.ItemsSource> 
       <Binding Path="My_Root" /> 
      </sdk:HierarchicalDataTemplate.ItemsSource> 
      <TextBlock Text="{Binding Path=Cod_Desc_Prod}" /> 
     </sdk:HierarchicalDataTemplate> 

     <sdk:TreeView Name="MyTreeView" ItemTemplate="{StaticResource MyNodeRoot}"/> 

在這裏我不明白我該怎麼做才能顯示子節點。

回答

0

我不是VB專家,但它看起來像你的Items屬性不是一個數組。我認爲它需要被宣佈如下。

Public Property Items() As My_Child() 

然後,在Compila_Class_My_Root方法,設置NodoRoot.Items時,這裏使用數組也:

Dim children As My_Child() = { NodoChild } 
NodoRoot.Items = children 

在你的XAML中,HierarchicalDataTemplate的數據上下文是My_Root實例,這就是爲什麼你可以綁定到My_Root(Cod_Desc_Prod)的屬性。同樣的ItemsSource應綁定到My_Root的屬性:

<Binding Path="Items" /> 

或者,你可以使用一個更簡潔的語法:

<sdk:HierarchicalDataTemplate x:Key="MyNodeRoot" ItemsSource="{Binding Items}"> 
     <TextBlock Text="{Binding Cod_Desc_Prod}" /> 
    </sdk:HierarchicalDataTemplate> 

最後,你需要指定兒童應該如何看。

<DataTemplate x:Key="MyChildTemplate"> 
    <StackPanel Orientation="Horizontal"> 
     <CheckBox IsChecked="{Binding Selezione, Mode=TwoWay}" /> 
     <TextBlock Text="{Binding Desc_PosFis}" /> 
     <!-- Or whatever you want here... --> 
    </StackPanel> 
</DataTemplate> 

<sdk:HierarchicalDataTemplate x:Key="MyNodeRoot" 
    ItemsSource="{Binding Items}" 
    ItemTemplate="{StaticResource MyChildTemplate}" 
    > 
    <TextBlock Text="{Binding Cod_Desc_Prod}" /> 
</sdk:HierarchicalDataTemplate> 
+0

謝謝睜開了眼睛在搜索的項目,它是完美的! – Fede30

+0

對不起,如何設置屬性「Selectione」= True,以瞭解哪個索引在樹視圖中被選中 – Fede30

+0

這取決於。您可以通過將複選框雙向綁定到該屬性來支持多選。我編輯了我的答案來表明這一點。但是,如果你想雙向綁定到TreeView.SelectedItem,我的Google搜索告訴我會更棘手。這[博客文章](http://silverscratch.blogspot。com/2010/11/two-way-binding-on-treeviewselecteditem.html)似乎有一個有趣的選擇。您可能希望將此問題作爲單獨的問題發佈在StackOverflow上。 – Andrew

0

非常感謝安德魯,我解決了如此(雖然它不是作爲一種解決方案很漂亮的)可能是有用的人):

我接過類:My_Child

Public Property Selezione 
    Get 
     Return Selezionato 
    End Get 
    Set(ByVal value) 
     Selezionato = value 
     NotifyPropertyChanged("Selezione") 
    End Set 
    End Property 

,並添加到這個屬性:

 Private My_Cod_Prod As String 
    Public Property Cod_Prod() As String 
     Get 
      Return My_Cod_Prod 
     End Get 
     Set(ByVal value As String) 
      My_Cod_Prod = value 
     End Set 
    End Property 

,人們在這樣:我修改

Private Sub Compila_Class_My_Root() 
    For Each Prod In Elenco_ASS_Prodotti_PosFiscali 
      Dim NodoRoot As New My_Root 

       NodoRoot.Cod_Prod = Prod.PFIS_CODPROD 
       NodoRoot.Desc_Prod = Prod.PFIS_DESCOM 
       NodoRoot.Cod_Desc_Prod = Prod.PFIS_CODPROD & " - " & Prod.PFIS_DESCOM 
      Dim NodoChild As New My_Child 
       NodoChild.Cod_PosFis = Prod.PFIS_POSFIS 
       Dim desc_pos_fis As String = get_DescrizionePosFis(Prod.PFIS_POSFIS) 
       NodoChild.Desc_PosFis = desc_pos_fis 
       NodoChild.Cod_Prod = Prod.PFIS_CODPROD '****** ADDED ******' 
       NodoRoot.Items = NodoChild 
      nodi.Add(NodoRoot) 
     Next 

    MyTreeView.ItemsSource = nodi 

End Sub 

然後在這裏我要收集

Private Sub MyTreeView_SelectedItemChanged(sender As Object, e As     System.Windows.RoutedPropertyChangedEventArgs(Of Object)) Handles MyTreeView.SelectedItemChanged 
    Dim myTreeView As TreeView = TryCast(sender, TreeView) 
    Dim chkele As My_Child 
    Dim chkprod As My_Root 
    Dim elemento 'elemento selezionato 
    Try 
     chkele = myTreeView.SelectedItem 

    Catch ex As Exception 
     chkele = Nothing 
    End Try 
    If chkele Is Nothing Then 
     ' ho selezionato il prodotto 
     chkprod = myTreeView.SelectedItem 
    End If 


    Try 
     elemento = (From ele In Elenco_ASS_Prodotti_PosFiscali Where ele.PFIS_CODPROD = chkele.Cod_Prod And ele.PFIS_POSFIS = chkele.Cod_PosFis).Single 
    Catch ex As Exception 

    End Try 

    End Sub