为什么需要 ItemsSource 是一个列表?
Why is it needed that the ItemsSource is a list?
我的 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必须是一个列表?为什么列表中总是只有一个元素,即根项?
更正:不一定是List
,而是IEnumerable
.
原因很简单:TreeView
可以有 1 个以上的元素,如 "root"。如果你想这样做,正如你所做的那样,你可以创建一个 Converter
将 NodeViewModel
转换为 List<NodeViewModel>
.
我的 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必须是一个列表?为什么列表中总是只有一个元素,即根项?
更正:不一定是List
,而是IEnumerable
.
原因很简单:TreeView
可以有 1 个以上的元素,如 "root"。如果你想这样做,正如你所做的那样,你可以创建一个 Converter
将 NodeViewModel
转换为 List<NodeViewModel>
.