昨天在做項目的時候碰到了這個問題,發現通常我們定義的數據不法綁定到控件上,接下來我將講一下我是怎么解決這個問題的。
要用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>
大家還有更好的辦法綁定多層級數據嗎?