2015-01-09 79 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"); 
    } 
} 

但這種方式的樹沒有顯示。

那麼,樹視圖的itemsSource必須是一個列表?爲什麼如果我總是隻有一個元素在列表中,這是根項目?

+3

TreeView的'ItemsSource'必須是'IEnumerable',僅僅因爲一個'TreeView'是一個'ItemsControl',它的行爲就像處理它的'ItemsSource'的任何其他'ItemsControl'一樣。 – 2015-01-09 20:17:25

回答

1

糾錯:沒必要是List,而是IEnumerable

原因很簡單:TreeView可以有超過1個元素作爲「root」。如果您想這樣做,就像您所做的那樣,您可以創建一個Converter,將NodeViewModel轉換爲List<NodeViewModel>

相關問題