昨天在做项目的时候碰到了这个问题,发现通常我们定义的数据不法绑定到控件上,接下来我将讲一下我是怎么解决这个问题的。
要用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部分
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>
大家还有更好的办法绑定多层级数据吗?