热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> Silverlight>>正文内容

Silverlight中的数据绑定2

发布时间:2010年08月13日点击数: 佚名

Silverlight中数据绑定,须由自己决定要使用的绑定模式,在前面一篇文章中都是使用了默认模式OneTime
银光中支持3种模式
   OneTime :仅在数据进行绑定时发生一次,以后更改绑定源对输出不产生任何影响

   OneWay :数据绑定只在从绑定源到绑定目标这一个方向起作用,即更改绑定源会更改绑定目标,且不需要在代码中进行额外的处理

   TwoWay :更改绑定源会更改绑定目标,反之亦然。

其中OneWay和TwoWay类似ASP.NET中的Eval与Bind绑定,需要注意的是,若使用这两者绑定模式,需要实现INotifyPropertyChanged接口
单向数据绑定

Xaml代码只是在之前的基础上添加了一个充当文本的按钮

  1. <Grid x:Name="PersonalPanel" Background="White"> 
  2.         <TextBlock Height="23" HorizontalAlignment="Left" Margin="88,53,0,0" Name="textBlock3" Text="{Binding FirstName}" VerticalAlignment="Top" /> 
  3.         <TextBlock Height="23" HorizontalAlignment="Left" Margin="89,116,0,0" Name="textBlock4" Text="{Binding LastName}" VerticalAlignment="Top" /> 
  4.         <Canvas Canvas.Left="120">    
  5.         <Polygon Fill="Black" Points="0,5,10,0,10,10" MouseLeftButtonDown="prev"></Polygon>     
  6.        <Polygon Fill="Black" Points="15,0,15,10,25,5" MouseLeftButtonDown="next"></Polygon>  
  7.           <TextBlock Text="Reverse" Canvas.Left="40" Canvas.Top="20" FontSize="13" MouseLeftButtonDown="reverse"></TextBlock> 
  8.         </Canvas>    
  9. </Grid> 

在此基础上完成单击时,使用reverse方法实现FirstName与LastName中的文本顺序颠倒

  1. public void reverse() 
  2.        { 
  3.            char [] c=new char[this.FirstName.Length]; 
  4.            for (int i = 0; i < this.FirstName.Length; i++) 
  5.            { 
  6.                c[i] = this.FirstName[this.FirstName.Length - 1 - i]; 
  7.            } 
  8.            this.FirstName = new String(c); 
  9.            c = new char[this.LastName.Length]; 
  10.            for (int i = 0; i < this.LastName.Length; i++) 
  11.            { 
  12.                c[i] = this.LastName[this.LastName.Length - 1 - i]; 
  13.            } 
  14.            this.LastName = new string(c); 
  15.        } 

接下来需要一个在更改属性时实现的公共事件:

  1. public event PropertyChangedEventHandler PropertyChanged; 

但是此事件无法自动使用,我们改写代码触发此事件,

  1. private string firstName; 
  2. public string FirstName 
  3.     get { return firstName; } 
  4.     set { firstName = value; 
  5.     if (PropertyChanged != null
  6.     { 
  7.    PropertyChanged(thisnew PropertyChangedEventArgs("FirstName")); 
  8.     } 
  9.     } 
  10. }  

最后实现鼠标单击的事件处理程序 Person类文件的完整代码:

  1. private string firstName; 
  2.  
  3.        public string FirstName 
  4.        { 
  5.            get { return firstName; } 
  6.            set { firstName = value; 
  7.            if (PropertyChanged != null
  8.            { 
  9.            PropertyChanged(thisnew PropertyChangedEventArgs("FirstName")); 
  10.            } 
  11.            } 
  12.        }   
  13.        //为进行演示,只对FirstName进行额外处理 
  14.        public string LastName { getset; } 
  15.        public void reverse() 
  16.        { 
  17.            char [] c=new char[this.FirstName.Length]; 
  18.            for (int i = 0; i < this.FirstName.Length; i++) 
  19.            { 
  20.                c[i] = this.FirstName[this.FirstName.Length - 1 - i]; 
  21.            } 
  22.            this.FirstName = new String(c); 
  23.            c = new char[this.LastName.Length]; 
  24.            for (int i = 0; i < this.LastName.Length; i++) 
  25.            { 
  26.                c[i] = this.LastName[this.LastName.Length - 1 - i]; 
  27.            } 
  28.            this.LastName = new string(c); 
  29.        } 
  30.  
  31.        public event PropertyChangedEventHandler PropertyChanged; 

不要忘记添加System.ComponentModel命名空间
后台代码:

  1. public partial class MainPage : UserControl 
  2.    { 
  3.        private int pos = -1; 
  4.        private Person[] persons; 
  5.        public MainPage() 
  6.        { 
  7.            InitializeComponent(); 
  8.           
  9.            persons = new Person[]  
  10.            { 
  11.             new Person{FirstName="David",LastName="Grenn"}, 
  12.             new Person{FirstName="Dam",LastName="White"}, 
  13.             new Person{FirstName="Tom",LastName="Smith"}, 
  14.            }; 
  15.        } 
  16.        public void prev(object sender, MouseButtonEventArgs e) 
  17.        { 
  18.            if (pos > 0) 
  19.                pos--; 
  20.            bind(); 
  21.        } 
  22.        public void next(object sender, MouseButtonEventArgs e) 
  23.        { 
  24.            if (pos < persons.Length - 1) 
  25.                pos++; 
  26.            bind(); 
  27.        } 
  28.        private void bind() 
  29.        { 
  30.            PersonalPanel.DataContext = persons[pos]; 
  31.        } 
  32.       <strong> private void reverse(object sender, MouseButtonEventArgs e) 
  33.        { 
  34.            persons[pos].reverse(); 
  35.        }</strong> 

运行时,会发现当单击Reverse时,只有名字颠倒了顺序,但是如果移动到下一个(或上一个),然后返回到之前的记录,会发现两者都颠倒了,原因在于只有FirstName属性触发了PropertyChanged事件,因此只更新名字的显示,但是当前进或者后退时,数据总是会再次绑定到元素上,因此会出现两者全部颠倒的情况。
双向数据绑定

双向数据绑定可以使得显示数据的变化可以在原始数据中得到反映
为简化起见,在前面的示例中进行改写,只保留了其中关键的代码,主要是在绑定中添加了Mode枚举,我们把XAML代码修改为:

  1. <Grid x:Name="PersonalPanel" Background="White">        
  2.         <TextBox Name="textBlock3"  Text="{Binding FirstName, Mode=TwoWay}" /> 
  3.         <TextBox Name="textBlock4"  Text="{Binding LastName, Mode=TwoWay}" />       
  4.         <Canvas Canvas.Left="120"> 
  5.             <Polygon Fill="Black" Points="0,5,10,0,10,10" MouseLeftButtonDown="prev"></Polygon> 
  6.             <Polygon Fill="Black" Points="15,0,15,10,25,5"  MouseLeftButtonDown="next"></Polygon> 
  7.         </Canvas> 
  8.  </Grid> 

C#代码也进行了一点改变,lastname也实现了触发PropertyChanged事件

  1. private string lastName; 
  2.        public string LastName 
  3.        { 
  4.            get { return lastName; } 
  5.            set {  
  6.                lastName = value; 
  7.                if (PropertyChanged != null
  8.                { 
  9.                    PropertyChanged(thisnew PropertyChangedEventArgs("LastName")); 
  10.                } 
  11.            } 
  12.        } 

其他代码部分则没有改变,运行时,当切换到某个字段时,(改变文本框内容后,需要使得文本框失去焦点),这时PropertyChanged事件会自动触发,
但是该事件不会在键入内容时立即触发,当单击下一条记录再返回时,因为使用了双向绑定,所以会自动传送给数据源。

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作