MVVM绑定多层级数据到TreeView并设置项目展开
昨天在做项目的时候碰到了这个问题,发现通常我们定义的数据不法绑定到控件上,接下来我将讲一下我是怎么解决这个问题的。
要用MVVM模式在程序中将层级数据绑定到TreeView上,通常我们定义的数据是形如文件夹和文件的结构,如:
folder-
file1
folder1-
file2
folder2-
这样的数据,我们一般定义的类如下
1 public class Folder 2 { 3 public string Name{set;get;} 4 public IList<Folder> Folders{set;get;} 5 public IList<File> Files{set;get;} 6 } 7 8 public class File 9 { 10 public string Name{set;get;} 11 }
而在XAML中直接用两个DataType类型为Folder和File的HierarchicalDataTemplate表示Folders和Files,这样显示出来的数据不能完整按照我们的意图的显示出来。显示结果为
folder-
folder1
结果只显示了文件Folder信息。
怎么解决这个问题呢?
1 public IList<object> Items 2 { 3 get{ 4 IList<object> items = new List<object>(); 5 foreach(var fo in this.Folders) 6 items.Add(fo); 7 foreach(var f in this.Files) 8 items.Add(f); 9 return items; 10 } 11 }
我们在Folder类中定义这个Items属性,接下来就是XAML部分
View Code
1 <HierarchicalDataTemplate DataType="{x:Type Model:Folder}" ItemsSource="{Binding Items}"> 2 <TextBlock Text="{Binding Name}" /> 3 </HierarchicalDataTemplate> 4 <DataTemplate DataType="{x:Type Model:File}"> 5 <TextBlock Text="{Binding Name}" /> 6 </DataTemplate>
这样就完美的解决了这个问题,看来多层级数据,XAML中只能解析为单属性递归。
数据绑定做完后,我还想在一开始加载就屏开TreeView中的所有项,其实这个只需要设置一下ItemContainerStyle的Style就可以了,如下
<TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="True" /> </Style> </TreeView.ItemContainerStyle>
大家还有更好的办法绑定多层级数据吗?
作者: YOYOFx
出处:https://www.cnblogs.com/maxzhang1985/p/12673160.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。