2010-04-15 2 views
0

У меня есть вид дерева определяется следующим образом:WPF: Проблема с TreeView привязки данных

<HierarchicalDataTemplate x:Key="ChildTemplate" 
          ItemsSource="{Binding Children}"> 
    <TextBlock Text="{Binding TagName, Mode=OneWay}"/> 
</HierarchicalDataTemplate> 
<HierarchicalDataTemplate x:Key="NavigationHeaderTemplate" 
          ItemsSource="{Binding Children}" 
          ItemTemplate="{StaticResource ChildTemplate}"> 
    <StackPanel Orientation="Horizontal" Margin="0"> 
     <Image Source="{Binding Image}" Height="16" Width="16"></Image> 
     <TextBlock Text="{Binding Header}"></TextBlock> 
    </StackPanel> 
</HierarchicalDataTemplate> 
<TreeView Grid.Row="0" Grid.Column="0" Margin="0" 
    FlowDirection="LeftToRight" 
    ItemTemplate="{StaticResource NavigationHeaderTemplate}" 
    Name="TreeView2"> 
</TreeView> 

связывания данных является:

public class ViewTag : INotifyPropertyChanged 
{ 
    private string _tagName; 
    public string TagName 
    { 
     get { return _tagName; } 
     set 
     { 
      _tagName = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Tag Name")); 
     } 
    } 
    private ObservableCollection<ViewTag> _childTags; 
    public ObservableCollection<ViewTag> ChildTags 
    { 
     get { return _childTags; } 
     set 
     { 
      _childTags = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("Child Tags")); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, e); 
    } 
    #endregion 

    public ViewTag(string tagName, ObservableCollection<ViewTag> childTags) 
    { 
     _tagName = tagName; 
     _childTags = childTags; 
    } 
} 

public class ViewNavigationTree 
{ 
    public string Image { get; set; } 
    public string Header { get; set; } 
    public ObservableCollection<ViewTag> Children { get; set; } 
} 

И мой тест связывание:

 var xy = new List<ViewNavigationTree>(); 
     List<ViewTag> tempTags = new List<ViewTag>(); 
     ViewTag t1, t2, t3, t4, t5, t6; 
     t1 = new ViewTag("Computers", null); 
     t2 = new ViewTag("Chemistry", null); 
     t3 = new ViewTag("Physics", null); 
     var t123 = new ObservableCollection<ViewTag>(); 
     t123.Add(t1); 
     t123.Add(t2); 
     t123.Add(t3); 
     t4 = new ViewTag("Science", t123); 
     var t1234 = new ObservableCollection<ViewTag>(); 
     t1234.Add(t4); 
     t5 = new ViewTag("All Items", t1234); 
     t6 = new ViewTag("Untagged", null); 

     var tall = new ObservableCollection<ViewTag>(); 
     tall.Add(t5); 
     tall.Add(t6); 
     xy.Add(new ViewNavigationTree() { Header = "Tags", Image = "img/tags2.ico", Children = tall }); 

     var rootFolders = eDataAccessLayer.RepositoryFacrory.Instance.MonitoredDirectoriesRepository.Directories.ToList(); 
     var viewFolders = new ObservableCollection<ViewTag>(); 
     foreach (var vf in rootFolders) 
     { 
      viewFolders.Add(new ViewTag(vf.FullPath, null)); 
     } 
     xy.Add(new ViewNavigationTree() { Header = "Folders", Image = "img/folder_16x16.png", Children = viewFolders }); 

     xy.Add(new ViewNavigationTree() { Header = "Authors", Image = "img/user_16x16.png", Children = null }); 
     xy.Add(new ViewNavigationTree() { Header = "Publishers", Image = "img/powerplant_32.png", Children = null }); 

     TreeView2.ItemsSource = xy; 

Проблема в том, что дерево показывает только:

+ Tags 
    All Items 
    Untagged 
+ Folders 
    dir 1 
    dir 2 
    ... 
Authors 
Publishers 

Элементы, которые я добавил в разделе «Все элементы», не отображаются.

Будучи грифом WPF, я не могу пощупать проблему. Любая помощь будет очень полезна.

+0

Что такое xy и ViewNavigationTree? –

+0

добавил недостающий код – Amirshk

ответ

1

Единственное, что выпрыгивает здесь, это то, что вы ссылаетесь на свойство Children в своем ChildTemplate вместо ChildTags, как определено в ViewTag.

+0

большое спасибо, стыдно за меня ... – Amirshk

0

Для привязки TreeView вам необходимо использовать HierarchicalDataTemplate. Это позволяет указать как данные для узла, так и дочерние элементы для узла (путем привязки к ItemsSource).

+0

@ Энди, забыл опубликовать этот код. Я использую HierarchicalDataTemplate. – Amirshk

Смежные вопросы