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:  }
posted @ 2012-06-22 01:41  Gene Li  阅读(2758)  评论(5编辑  收藏  举报