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: }
