Silverlight 中 TreeView 的数据绑定
Silverlight使用XAML标记语言来编写,如果不使用XAML强大的绑定功能,实在是罪过。通过使用绑定,可以将UI与视图模型层分离,有利于系统的维护。作为Silverlight中比较有代表型的一个控件: TreeView 有着比较特殊的绑定。与一般的绑定不同,绑定到TreeView的元素之间是一个无限级联的关系。下面是这种绑定的最简单实现过程。
1, 引用命名空间:clr-namespace:System.Windows;assembly=System.Windows.Controls;给这个命名空间取个别名:common
2, 为TreeView 定义数据源。这里实际上只是定义了TreeNode绑定的实体的定义,TreeView绑定的则是这个实体对象的集合,该实体对象的定义如下:
1: public class TreeNode
2: {
3: public string Name { get; set; }
4: public Collection<TreeNode> Nodes { get; set; }
5: }
3, 定义TreeView中节点的模板,这个模板需要使用分层的数据模板:common:HierarchicalDataTemplate;其代码如下:
1: <UserControl.Resources>
2: <common:HierarchicalDataTemplate x:Key="TreeNodeTemplate" ItemsSource="{Binding Path=Nodes}" >
3: <TextBlock Text="{Binding Path=Name}" />
4: </common:HierarchicalDataTemplate>
5: </UserControl.Resources>
如上面的代码所示: ItemsSource中的Nodes表示的是TreeViewNode对应实体的子实体属性名称。见TreeNode类中的第二个属性:Nodes。而上面代码中的TextBlock的Text属性所绑定的数据则是来自于 TreeNode实体中的 Name属性。
4, 将在第3步中定义的模板绑定到TreeView控件。他的绑定也是很简单,如下面的代码所示:
1: <sdk:TreeView HorizontalAlignment="Left" Margin="12,12,0,12" Name="treeView1" Width="199"
2: ItemTemplate="{StaticResource TreeNodeTemplate}" />
上面的两行代码,即完成了TreeView的绑定, 只需要将在第3步中定义的模板绑定到TreeView控件的ItemTemplate即可。以上这4步完成之后,只需要为 TreeView ItemSource指定一个 TreeNode的集合,即可将此实体绑定到 TreeView中。为了让标记更加简洁,此示例中,将这一操作放到前页面的后台代码中,如下所示:
1: public partial class MainPage : UserControl
2: {
3: private Collection<TreeNode> TreeNodes;
4:
5: public MainPage()
6: {
7: InitializeComponent();
8:
9: this.Loaded += new RoutedEventHandler(MainPage_Loaded);
10: }
11: void MainPage_Loaded(object sender, RoutedEventArgs e)
12: {
13: OnLoadNodes();
14: OnBindDataSource();
15: }
16: private void OnBindDataSource()
17: {
18: this.treeView1.ItemsSource = TreeNodes;
19: }
20: private void OnLoadNodes()
21: {
22: TreeNodes = new Collection<TreeNode>();
23:
24: for (int i = 0; i < 10; i++)
25: {
26: TreeNode node = new TreeNode();
27: node.Name = i.ToString();
28:
29: for (int j = 0; j < 10; j++)
30: {
31: TreeNode subNode = new TreeNode();
32: subNode.Name = j.ToString();
33:
34: if (node.Nodes == null)
35: node.Nodes = new Collection<TreeNode>();
36:
37: node.Nodes.Add(subNode);
38: }
39:
40: TreeNodes.Add(node);
41: }
42: }
43: }