2015-01-09 3 views
-2

У меня есть вид дерева в моем файле XAML, как это:Для чего нужен элемент ItemsSource?

<TreeView ItemsSource="{Binding Items}" Margin="0,0,5,5" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type ViewModels:NodeViewModel}" ItemsSource="{Binding Path=Descendants}"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding Path=Node.Name}}" FontWeight="Bold"/> 
      </StackPanel> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

мой взгляд модель обладает этим свойством:

private List<NodeViewModel> _items = new List<NodeViewModel>(); 
public List<NodeViewModel> Items 
{ 
    get { return _items; } 
    set 
    { 
     _items = value; 
     base.RaisePropertyChangedEvent("Items"); 
    } 
} 

Это прекрасно работает, но II заметил, что элементы списка всегда только один элемент, корневой элемент, а дерево создается путем итерации через потомков. Поэтому я стараюсь изменить свойство на это:

private NodeViewModel _rootItem; 
public List<NodeViewModel> RootItem 
{ 
    get { return _rootItem; } 
    set 
    { 
     _rootItem= value; 
     base.RaisePropertyChangedEvent("RootItem"); 
    } 
} 

Но таким образом дерево не отображается.

Итак, элементы источника дерева должны быть списком? Почему, если у меня всегда есть только один элемент в списке, это корневой элемент?

+3

Элемент 'ItemsSource' TreeView должен быть' IEnumerable' просто потому, что 'TreeView' является' ItemsControl' и ведет себя как любой другой 'ItemsControl' в том, как он имеет дело с' ItemsSource'. –

ответ

1

Исправление: не обязательно List, но IEnumerable.

Причина довольно проста: TreeView может иметь более 1 элемента как «корень». Если вы хотите сделать это так, как вы это сделали, вы можете создать Converter, который преобразует NodeViewModel в List<NodeViewModel>.