2013-12-17 159 views
0

我有一個TreeView與綁定,但在TreeView中只顯示第一級別的項目。我需要一個treeview =)我弄壞了自己的頭。如何綁定到WPF TreeView?

這裏是我的代碼:

MainWindow.xaml

<TreeView Margin="2.996,10,214,10" ItemsSource="{Binding Path=Urls}" Grid.Column="1"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate> 
       <Grid> 
        <Rectangle Fill="{Binding Path=Color}" HorizontalAlignment="Left" Stroke="Black" VerticalAlignment="Top" Height="20" Width="20"/> 
        <TextBlock Text="{Binding Path=AbsoluteUrl}" Margin="25,0,0,0" /> 
       </Grid> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <DataTemplate> 
         <TextBlock Text="{Binding Path=AbsoluteUrl}" /> 
        </DataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
</TreeView> 

MainViewModel.cs(部分)

public ObservableCollection<Url> Urls { get; set; } 

    public MainWindowViewModel() 
    { 
     Urls = new ObservableCollection<Url>(); 
    } 

Url.cs

class Url : INotifyPropertyChanged 
{ 
    public Url() { } 

    public Url(string absoluteUrl, bool isBroken, string color) 
    { 
     AbsoluteUrl = absoluteUrl; 
     IsBroken = isBroken; 
     Color = color; 
    } 

    enum Status { Working, Broken }; 

    private ObservableCollection<Url> childUrlsValue = new ObservableCollection<Url>(); 
    public ObservableCollection<Url> ChildUrls 
    { 
     get 
     { 
      return childUrlsValue; 
     } 
     set 
     { 
      childUrlsValue = value; 
     } 
    } 

    private string _absoluteUrl; 
    public string AbsoluteUrl 
    { 
     get { return _absoluteUrl; } 
     set 
     { 
      if (_absoluteUrl != value) 
      { 
       _absoluteUrl = value; 
       OnPropertyChanged("AbsoluteUrl"); 
      } 
     } 
    } 

    private bool _isBroken; 
    public bool IsBroken 
    { 
     get { return _isBroken; } 
     set 
     { 
      if (_isBroken != value) 
      { 
       _isBroken = value; 
       OnPropertyChanged("IsBroken"); 
      } 
     } 
    } 

    private string _color; 
    public string Color 
    { 
     get { return _color; } 
     set 
     { 
      if (_color != value) 
      { 
       _color = value; 
       OnPropertyChanged("Color"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

而只是這個我添加項目到URL:

Url DataGridTopic = new Url(startUrl.ToString(), true, "red"); 
        DataGridTopic.ChildUrls.Add(
         new Url(startUrl.ToString(), true, "red")); 
        DataGridTopic.ChildUrls.Add(
         new Url(startUrl.ToString(), true, "red")); 
        DataGridTopic.ChildUrls.Add(
         new Url(startUrl.ToString(), true, "red")); 
        Urls.Add(DataGridTopic); 

回答

2

你必須告訴HierarchicalDataTemplate從哪裏通過使用其ItemsSource屬性獲取一個節點的子項。

你的情況:

<HierarchicalDataTemplate 
    DataType="{x:Type my:Url}" 
    ItemsSource="{Binding Path=ChildUrls}" 
> 
     ... 
</HierarchicalDataTemplate> 

還要注意使用OD的數據類型屬性,這往往會成爲一種必然,如果樹的層次是由不同的對象類型(目錄樹和文件就是這樣一個例子)。但是,我不確定這是否適用於您的情況。

+0

我需要粘貼嗎? – BJladu4

+0

@ user2932802,你是否能夠閱讀和理解你的問題中給出的你自己的XAML? – elgonzo