1
2
3
|
<Grid.Resources>
<my:Dog x:Name="MyDog" DogName="Spot"/>
</Grid.Resources>
|
4.通过设置 Source 属性或 DataContext 属性绑定到源对象。该元素的所有子级都继承 DataContext。
XAML
<TextBlock Text="{Binding DogName, Source={StaticResource MyDog}, Mode=OneTime}"/>
- 或 -
XAML
<TextBlock Text="{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>
此例中数据源是一个XAML对象,该对象是代码中创建的MyDog类的一个实例。Binding是在XAML中的TextBlock中指定的Binding,如示例中的代码那样指定的话,也就相当于创建了以个Binding对象并制定其路径(DogName)和模式等。
使用代码创建绑定
1.添加 System.Windows.Data 命名空间。
C#
using System.Windows.Data; (Binding类的命名空间)
2.定义源对象。
C#
public class Dog
{
public string DogName { get; set; }
}
3.创建要绑定到的 FrameworkElement。
XAML
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="MyTextBlock" Text="Test"/>
</Grid>
4.创建源对象的实例。
C#
Dog MyDog = new Dog();
MyDog.DogName = "Spot";
5.创建绑定对象。
C#
Binding MyBinding = new Binding();
6.对绑定对象设置绑定属性。
C#
MyBinding.Path = new PropertyPath("DogName");
MyBinding.Mode = BindingMode.OneTime;
7.通过设置 Source 属性或 DataContext 属性来设置绑定源。该元素的所有子级都继承 DataContext。
C#
MyBinding.Source = MyDog;
- 或 -
C#
MyTextBlock.DataContext = MyDog;
8.将此绑定附加到 FrameworkElement 的属性。
C#
MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);
以上示例中是通过代码创建绑定的示例。这个示例中在TextBlock的Text属性中就没有创建Binding对象了,而是通过后台创建好Binding对象,并设置好属性,然后通过MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);将TEXT属性进行绑定。
在两个示例中都可以看到,指定数据源有两种方法,以TextBlock为例,可以指定Binding类的Source属性到数据源,也可以将TextBlock的DataContext指定到数据源,效果一样,如果TextBlock没有指定数据源,会在其绑定的Binding中寻找是否有数据源。
在实际开发中,为了让程序更可看更有条理,我们会混合使用两种方法,及在后台创建数据源,在XAML中绑定。这样前台就免去了创建数据源的XAML元素,后台省去了创建Binding类的代码,并且通过查看前台的XAML代码就可以很容易的判断出各个控件的绑定数据。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Data;
namespace SilverlightTest
{
public partial class Databind : UserControl
{
public Databind()
{
InitializeComponent();
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Mind m = new Mind();
txt1.DataContext = m;
}
}
public class Mind //数据源
{
string _info="OK";
public string Info
{
get
{
return _info;
}
set
{
_info = value;
}
}
}
}
XAML:
<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" x:Class="SilverlightTest.Databind"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300" Loaded="UserControl_Loaded">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="txt1" Text="{Binding Info,Mode=OneTime}" />
</Grid>
</UserControl>
|
这样的写法让数据绑定可读性更高,也更容易理解,最常用的方式。
下面来比对下XAML创建和代码创建:
{Binding Info,Mode=OneTime}
相当于
Binding MyBinding = new Binding();
MyBinding.Path = new PropertyPath("Info");
MyBinding.Mode = BindingMode.OneTime;
Text="{Binding Info,Mode=OneTime}"
相当于
MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);
<TextBlock Text="{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>中的 DataContext="{StaticResource MyDog}
相当于
txt1.DataContext = m;
以上就是在Silverlight中数据绑定的一些简要介绍。
混合XAML 和代码的创建数据绑定的方式是最容易理解和阅读的,所以我们经常会看到在使用DataGrid的通过制定ItemsSource 到数据源后,在XAML中就直接使用"{Binding Address}"进行数据绑定了,DataGrid中的ItemSource也就相当于TextBlock的DataContext属性了,其他控件的数据绑定方法了类似,另外数据源可以用类,也可以是字符串类型等常量类型,使用常量类型时,就不需要指定Binding的Path属性了,因为他本身就是数据。
另外,Binding还有许多高级用法,例如控件对数据的共享,数据的更新绑定等,这些内容在Silverlight文档中都有,清楚基本概念后,万变不离其中。
本文来自小猪change 的博客,原文地址:http://blog.sina.com.cn/s/blog_59a314c70100mv09.html