为什么需要ItemsSource是一个列表?

时间:2015-01-09 19:48:46

标签: wpf treeview wpf-controls

我的xaml文件中有一个树视图,如下所示:

<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");
    }
}

这很好用,但我注意到列表项始终只有一个元素,根项,并且通过遍历后代创建树。所以我尝试将属性更改为:

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

但是这样就没有显示树了。

那么,树视图的itemsSource必须是一个列表吗?为什么我在列表中只有一个元素,即根项?

1 个答案:

答案 0 :(得分:1)

更正:它不一定是List,而是IEnumerable

原因很简单:TreeView可以有超过1个元素作为&#34; root&#34;。如果您愿意这样做,就像您已经完成的那样,您可以创建Converter,将NodeViewModel转换为List<NodeViewModel>