概要:
最近较忙,遇到些头疼的事情。更加觉得没有接触过的知识太多,而学过的却是仅停留在表面,忘得多记得少。看来还要更加努力啊,
时间还得再挤挤。好了,继续学习TerryLee的《一步一步学Silverlight 2系列文章》——数据绑定。
绑定模式:
这是李老师总结Silverlight2中的模式,我想我们也可以在Silverlight3中试试。
1.OneTime:一次绑定,在绑定创建时使用源数据更新目标,适用于只显示数据而不进行数据的更新。
2.OneWay:单向绑定,在绑定创建时或者源数据发生变化时更新到目标,适用于显示变化的数据。
3.TwoWay:双向绑定,在任何时候都可以同时更新源数据和目标。
一次绑定:
我的例子:添加个User类:
代码public class User
{
private string _name = string .Empty;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
private string _pWD = string .Empty;
public string PWD
{
get
{
return _pWD;
}
set
{
_pWD = value;
}
}
}
MainPage.xaml:
代码
< Grid x:Name ="LayoutRoot" Background ="#46461F" Loaded ="LayoutRoot_Loaded" >
< Grid.RowDefinitions >
< RowDefinition Height ="50" ></ RowDefinition >
< RowDefinition Height ="50" ></ RowDefinition >
</ Grid.RowDefinitions >
< Grid.ColumnDefinitions >
< ColumnDefinition Width ="100" ></ ColumnDefinition >
< ColumnDefinition Width ="100" ></ ColumnDefinition >
</ Grid.ColumnDefinitions >
< TextBlock x:Name ="txtName" Grid.Row ="0" Grid.Column ="0"
Foreground ="White" Text =" {Binding Name} " ></ TextBlock >
< TextBlock x:Name ="txtPWD" Grid.Row ="1" Grid.Column ="0"
Foreground ="White" Text =" {Binding PWD} " ></ TextBlock >
< Button x:Name ="btnOK" Content ="变了" Grid.Row ="0" Grid.Column ="1" Click ="btnOK_Click" ></ Button >
</ Grid >
MainPage.xaml.cs:
代码
public MainPage()
{
InitializeComponent();
}
User user = new User();
private void btnOK_Click( object sender, RoutedEventArgs e)
{
user.Name = " 李 " ;
user.PWD = " li " ;
txtName.DataContext = user;
txtPWD.DataContext = user;
}
private void LayoutRoot_Loaded( object sender, RoutedEventArgs e)
{
user.Name = " 张 " ;
user.PWD = " zhang " ;
txtName.DataContext = user;
txtPWD.DataContext = user;
}
运行:
呵呵,这个基本上就是照抄李老师的代码。不过我加个button,不是说只能一次绑定么。那我就试试这样会不会变呢?
点击之后,果然没变。为什么呢?按照运行机制应该会变的啊?这个问题先放放,看看下个例子怎么回事。
单向绑定:
若想实现单向或双向绑定,就要让实体类继承INotifyPropertyChanged接口,这个接口是用于向客户端发送某一属性值已更改的
通知。这个接口来自System.ComponentModel;命名空间,相信做过控件开发的朋友都知道这个空间的强悍作用。
其他不变,新的USer类:
代码public class User:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _name = string .Empty;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
if (PropertyChanged != null )
{
// 发送属性更改通知
PropertyChanged( this , new PropertyChangedEventArgs( " Name " ));
}
}
}
private string _pWD = string .Empty;
public string PWD
{
get
{
return _pWD;
}
set
{
_pWD = value;
if (PropertyChanged != null )
{
// 发送属性更改通知
PropertyChanged( this , new PropertyChangedEventArgs( " PWD " ));
}
}
}
}
看看点击后的效果:
呵呵,真的变了。这些下子明白了上个例子遗留的问题了吧。还不明白?呵呵,注意到点击时页面的刷新了么?没有刷新,Silverlight
页面并没有刷新,所以一般情况下,服务器传来的并不是页面完全的信息。
双向绑定:
单向绑定我明白了怎么回事,那双向就简单了。个人觉得李老师的这个例子不好。我来个原创的,呵呵。说了这么多绑定方式,那
绑定方式怎么设定的呢?
右击Text属性:
选择绑定,看到了吧,三种绑定模式
来看看例子吧,User类:
代码public class User:INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _name = string .Empty;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
if (PropertyChanged != null )
{
// 发送属性更改通知
PropertyChanged( this , new PropertyChangedEventArgs( " Name " ));
}
}
}
private string _pWD = string .Empty;
public string PWD
{
get
{
return _pWD;
}
set
{
_pWD = value;
if (PropertyChanged != null )
{
// 发送属性更改通知
PropertyChanged( this , new PropertyChangedEventArgs( " PWD " ));
}
}
}
}
MainPage.xaml:
代码MainPage.xaml.cs:
< Grid x:Name ="LayoutRoot" Background ="#46461F" Loaded ="LayoutRoot_Loaded" >
< Grid.RowDefinitions >
< RowDefinition ></ RowDefinition >
< RowDefinition ></ RowDefinition >
< RowDefinition ></ RowDefinition >
</ Grid.RowDefinitions >
< Grid.ColumnDefinitions >
< ColumnDefinition ></ ColumnDefinition >
< ColumnDefinition ></ ColumnDefinition >
< ColumnDefinition ></ ColumnDefinition >
</ Grid.ColumnDefinitions >
< TextBlock Text ="一次绑定" Grid.Row ="0" Grid.Column ="0" Width ="100" Height ="50" ></ TextBlock >
< TextBlock Text ="单向绑定" Grid.Row ="1" Grid.Column ="0" Width ="100" Height ="50" ></ TextBlock >
< TextBlock Text ="双向绑定" Grid.Row ="2" Grid.Column ="0" Width ="100" Height ="50" ></ TextBlock >
< TextBox x:Name ="txtName0" Grid.Row ="0" Grid.Column ="1" Width ="100" Height ="50" Text ="{Binding Name,Mode=OneTime}" ></ TextBox >
< TextBox x:Name ="txtName1" Grid.Row ="1" Grid.Column ="1" Width ="100" Height ="50" Text ="{Binding Mode=OneWay, Path=Name}" ></ TextBox >
< TextBox x:Name ="txtName2" Grid.Row ="2" Grid.Column ="1" Width ="100" Height ="50" Text ="{Binding Mode=TwoWay, Path=Name}" ></ TextBox >
< TextBox x:Name ="txtPWD0" Grid.Row ="0" Grid.Column ="2" Width ="100" Height ="50" Text ="{Binding PWD,Mode=OneTime}" ></ TextBox >
< TextBox x:Name ="txtPWD1" Grid.Row ="1" Grid.Column ="2" Width ="100" Height ="50" Text ="{Binding Mode=OneWay, Path=PWD}" ></ TextBox >
< TextBox x:Name ="txtPWD2" Grid.Row ="2" Grid.Column ="2" Width ="100" Height ="50" Text ="{Binding Mode=TwoWay, Path=PWD}" ></ TextBox >
</ Grid >
代码
User user = new User();
private void LayoutRoot_Loaded( object sender, RoutedEventArgs e)
{
user.Name = " 张 " ;
user.PWD = " zhang " ;
txtName0.DataContext = user;
txtName1.DataContext = user;
txtName2.DataContext = user;
txtPWD0.DataContext = user;
txtPWD1.DataContext = user;
txtPWD2.DataContext = user;
}
运行一下:
上图是修改双向绑定里面的值,会发现单向绑定也会随之改变,但一次绑定怎么都不会变。而修改一次绑定和单向绑定,其他的值
并不会随之改变。这下三种绑定区别明显了吧。比如我们可以在注册用户的时候,用户名用双向绑定,填完后服务器可以检查数据
是否重复,然后给提示单向绑定,返回用户名已存在或合法用户等。。。
这个数据绑定就是这些,大家可以发挥想象,写出更好的应用。
总目录
上一篇:vs2010 学习Silverlight学习笔记(9):使用用户控件(2)
下一篇:vs2010 学习Silverlight学习笔记(11):数据与通信之WebClient