2012-03-13 107 views
2

我有MyPOCO對象MyCollection(它有兩個字符串屬性)。Silverlight Treeview inline HierarchicalDataTemplate綁定問題

當我嘗試將HierarchicalDataTemplate實現到樹視圖中時,綁定不起作用,我得到類名。

我知道如果我從控制中取出數據模板一切正常,但我有興趣看看爲什麼這個例子不起作用。

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource testVM}}"> 
    <sdk:TreeView Margin="8,8,8,111" ItemsSource="{Binding MyCollection}"> 
     <sdk:HierarchicalDataTemplate ItemsSource="{Binding MyPOCO}"> 
      <sdk:HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Text="{Binding Property1}"/> 
         <TextBlock Text="{Binding Property2}"/> 
        </StackPanel> 
       </DataTemplate> 
      </sdk:HierarchicalDataTemplate.ItemTemplate> 
     </sdk:HierarchicalDataTemplate> 
    </sdk:TreeView> 
</Grid> 

這裏是ViewModel也。

namespace MyPOCProject 

{ 公共類MyPOCO { 私人字符串property1;

public string Property1 
    { 
     get { return property1; } 
     set { property1 = value; } 
    } 

    private string property2; 

    public string Property2 
    { 
     get { return property2; } 
     set { property2 = value; } 
    } 

    public MyPOCO(string p1, string p2) 
    { 
     property1 = p1; 
     property2 = p2; 
    } 
} 

public class MyViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<MyPOCO> myCollection; 

    public ObservableCollection<MyPOCO> MyCollection 
    { 
     get { return myCollection; } 
     set { myCollection = value; RaisePropertyChanged("MyCollection"); } 
    } 

    public MyViewModel() 
    { 
     MyPOCO _poco1 = new MyPOCO("aaa1", "bbb1"); 
     MyPOCO _poco2 = new MyPOCO("aaa2", "bbb2"); 
     MyPOCO _poco3 = new MyPOCO("aaa3", "bbb3"); 

     MyCollection = new ObservableCollection<MyPOCO>() { _poco1, _poco2, _poco3 }; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

}

那我做錯了嗎?

重新...我對這個特殊的例子感興趣。我想知道這個例子有什麼問題,爲什麼。

謝謝。

+0

你有更多的代碼?我想看看課程。 – Silvermind 2012-03-13 18:24:42

+0

我更新了帖子。謝謝Silvermind。 – asuciu 2012-03-13 23:15:08

回答

2

您發佈的代碼不是分層的,換句話說:MyPOCO類不包含屬性MyCollection<MYPOCO>兒童。 下面是HierarchicalDataTemplate

的XAML的例子:

<sdk:TreeView x:Name="MyTreeView" 
       HorizontalAlignment="Left" 
       ItemsSource="{Binding MyCollection}" 
       Width="200" Height="280"> 
    <sdk:TreeView.ItemTemplate> 
     <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Children}"> 
      <TextBlock Text="{Binding Path=Header}"/> 
      <sdk:HierarchicalDataTemplate.ItemTemplate> 
       <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Children}"> 
        <TextBlock Text="{Binding Path=Header}"/> 
       </sdk:HierarchicalDataTemplate> 
      </sdk:HierarchicalDataTemplate.ItemTemplate> 
     </sdk:HierarchicalDataTemplate> 
    </sdk:TreeView.ItemTemplate> 
</sdk:TreeView> 

代碼隱藏類:

public class MyPoco 
{ 
    public MyPoco(string header, int sampleChildrenCount) 
    { 
     this.Header = header; 
     this.Children = new ObservableCollection<MyPoco>(); 
     if (sampleChildrenCount > 0) 
     { 
      for (int i = 0; i < sampleChildrenCount; i++) 
      { 
       string newHeader = String.Format("Test {0}", sampleChildrenCount * i); 
       var myPoco = new MyPoco(newHeader, sampleChildrenCount - 1) 
       this.Children.Add(myPoco); 
      } 
     } 
    } 
    public string Header { get; set; } 
    public ObservableCollection<MyPoco> Children { get; set; } 
} 

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     MyCollection = new ObservableCollection<MyPoco>(); 
     for (int i = 0; i < 6; i++) 
     { 
      this.MyCollection.Add(new MyPoco(String.Format("Test {0}", i), 5)); 
     } 
    } 
    public ObservableCollection<MyPoco> MyCollection { get; set; } 
} 

代碼隱藏啓動:

public MainPage() 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 
     MyTreeView.DataContext = new MyViewModel(); 
    } 
} 
+0

這個想法是基於從WebService返回的任何內容,我應該能夠在TreeView中顯示它。想象一下當你的根目錄只有幾個目錄時。因爲當我使用模板時,相同的代碼起作用,所以我真的懷疑我必須像提到的那樣創建對象結構。我想這個問題來自於控件以及它附加模板資源與控件中指定的內聯模板的方式。感謝您的回覆。 – asuciu 2012-03-15 01:46:44

+0

但是如果代碼不是分級的,它將不能在這樣的HierarchicalDataTemplate中工作。即使你沒有填充任何孩子,也要儘量讓它分層次。否則,你應該使用DataTemplate,它是用於非分層數據的。 – Silvermind 2012-03-15 11:33:31

+0

謝謝Silverlmind。 – asuciu 2012-03-15 15:08:46

相關問題