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

Silverlight中的数据绑定3

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

Silverlight中实现数据转换的机制与ASP.NET应该讲是同样的思想,只不过ASP.NET中似乎淡化了手动编写关于数据转换的部分,在Silverlight中我们实现数据转换需实现接口IValueConverter,其位于System.Windows.Data中,IValueConverter其包含两个方法:

         Convert():当数据从数据源发送到绑定目标时调用

              ConvertBack():当数据从绑定目标发送回绑定源时调用     

只有双向绑定时才需要真正实现这两个方法,当单向绑定时,只需实现Convert(),对于ConvertBack()可以使用throw new NotImplementException形式的代码填充。下面仍然以之前的示例为基础,实现FirstName与LastName中的内容为首字母大写形式。

首先仍然沿用先前的Person类:
 

  1. public class Person:INotifyPropertyChanged 
  2.    { 
  3.        public event PropertyChangedEventHandler PropertyChanged; 
  4.        public Person() { } 
  5.        private string firstName; 
  6.        public string FirstName 
  7.        { 
  8.            get { return firstName; } 
  9.            set { firstName = value; 
  10.            if (PropertyChanged != null
  11.            { 
  12.                PropertyChanged(thisnew PropertyChangedEventArgs("FirstName")); 
  13.            } 
  14.            } 
  15.        } 
  16.        private string lastName; 
  17.        public string LastName 
  18.        { 
  19.            get { return lastName; } 
  20.            set {  
  21.                lastName = value; 
  22.                if (PropertyChanged != null
  23.                { 
  24.                    PropertyChanged(thisnew PropertyChangedEventArgs("LastName")); 
  25.                } 
  26.            } 
  27.        } 

然后实现一个基于IValueConverter的类,完整代码: 

  1. namespace DataBindSilverlight 
  2.     public class UCFirst:IValueConverter 
  3.     { 
  4.         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
  5.         { 
  6.             var name = (string)value; 
  7.             if (name.Length > 0) 
  8.             { 
  9.                 var firstname = name.Substring(0,1); 
  10.                 name = firstname.ToUpper() + name.Substring(1); 
  11.             } 
  12.             return name; 
  13.         } 
  14.         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
  15.         { 
  16.             return (string)value; 
  17.         } 
  18.     } 

这两步工作完成后,下面的工作即是需要在XAML标记中告知Silverlight使用此转换器,首先,定义一个XML前缀,使得XAML可以访问DataBindSilverlight 空间中的类,代码为:<Canvas xmlns:local="clr-namespace:DataBindSilverlight"/> 第二步则是创建一个Resource子元素,其可以使用DataBindSilverlight,包括UCfirst转换器,这里我们将UCfirst作为内部资源加载,代码:

  1. <Canvas.Resources>  
  2.             <local:UCFirst x:Key="ucfirstConverter"></local:UCFirst>  
  3.          </Canvas.Resources>  

以上代码添加了一个键x:Key,用来对资源的引用,接下来在TextBox元素中提供转换器的名称
 

  1. <TextBox  Name="textBlock4" Text="{Binding LastName, Mode=TwoWay,Converter={StaticResource ucfirstConverter}}"  /> 

关键字StaticResouces表示使用的资源是内部资源,ucfirstConverter是分配给<local:UCFirst/>的键值。 那么我们已经完成了整个XAML的代码的设计:

  1. <Grid x:Name="PersonalPanel" Background="White">    
  2.      <Canvas xmlns:local="clrnamespace:DataBindSilverlight">  
  3.         <Canvas.Resources>    
  4.            <local:UCFirst x:Key="ucfirstConverter"></local:UCFirst>    
  5.              </Canvas.Resources>  
  6.                <TextBox Height="23" HorizontalAlignment="Left" Margin="88,53,0,0"  Name="textBlock3" Text="{Binding FirstName,Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}"BindingValidationError="showError"VerticalAlignment="Top" /> 
  7.                 <TextBox Height="23" HorizontalAlignment="Left" Margin="89,89,0,0"  Name="textBlock4" Text="{Binding LastName, Mode=TwoWay, Converter={StaticResource ucfirstConverter},ValidatesOnExceptions=True,NotifyOnValidationError=True}" BindingValidationError="showError" VerticalAlignment="Top" /> 
  8.               <Canvas Canvas.Left="120"> 
  9.             <Polygon Fill="Black" Points="0,5,10,0,10,10" MouseLeftButtonDown="prev"></Polygon> 
  10.             <Polygon Fill="Black" Points="15,0,15,10,25,5"  MouseLeftButtonDown="next"></Polygon> 
  11.              <TextBlock Text="Reverse" Canvas.Left="40" Canvas.Top="20" FontSize="13" MouseLeftButtonDown="reverse"></TextBlock> 
  12.           </Canvas>  
  13.           </Canvas> 
  14.          </Grid>  


后台代码其实没有变化,为了方便,仍然贴出来

  1. private int pos = -1; 
  2. private Person[] persons; 
  3. public MainPage() 
  4.     InitializeComponent();           
  5.     persons = new Person[]  
  6.     { 
  7.      new Person{FirstName="david",LastName="Grenn"}, 
  8.      new Person{FirstName="dam",LastName="white"}, 
  9.      new Person{FirstName="tom",LastName="Smith"}, 
  10.     };          
  11. public void prev(object sender, MouseButtonEventArgs e) 
  12.     if (pos > 0) 
  13.         pos--; 
  14.     bind(); 
  15. public void next(object sender, MouseButtonEventArgs e) 
  16.     if (pos < persons.Length - 1) 
  17.         pos++; 
  18.     bind(); 
  19. private void bind() 
  20.     PersonalPanel.DataContext = persons[pos]; 

尽管在硬编码中,我们看到的是小写字母单词呈现的单词,但是运行时,已经成功的将其首字母改变为大写形式。

数据验证
当绑定的数据发生更改时,如果需要确保新数据仍然符合某些预先设定的规则,我们基于前面的数据转换示例扩展这一功能首先更新XAML文件,在TextBox元素中提供绑定信息时设置ValidatesOnExceptions,NotifyOnValidationError两个属性为True

 XAML完整代码:

  1. <Grid x:Name="PersonalPanel" Background="White">   
  2.          <Canvas xmlns:local="clr-namespace:DataBindSilverlight">  
  3.               <Canvas.Resources>      
  4.               <local:UCFirst x:Key="ucfirstConverter"></local:UCFirst> 
  5.               </Canvas.Resources> 
  6.                <TextBox Height="23" HorizontalAlignment="Left" Margin="88,53,0,0"  Name="textBlock3" Text="{Binding FirstName, Mode=TwoWay,ValidatesOnExceptions=True,NotifyOnValidationError=True}" BindingValidationError="showError" VerticalAlignment="Top" />  
  7.               <TextBox Height="23" HorizontalAlignment="Left" Margin="89,89,0,0"  Name="textBlock4" Text="{Binding LastName, Mode=TwoWay, Converter={StaticResource ucfirstConverter},ValidatesOnExceptions=True,NotifyOnValidationError=True}" BindingValidationError="showError" VerticalAlignment="Top" /> 
  8.                <Canvas Canvas.Left="120"> 
  9.                <Polygon Fill="Black" Points="0,5,10,0,10,10" MouseLeftButtonDown="prev"></Polygon> 
  10.             <Polygon Fill="Black" Points="15,0,15,10,25,5"  MouseLeftButtonDown="next"></Polygon> 
  11.                <TextBlock Text="Reverse" Canvas.Left="40" Canvas.Top="20" FontSize="13" MouseLeftButtonDown="reverse"></TextBlock> 
  12.            </Canvas> 
  13.             </Canvas> 
  14.           </Grid> 

注意BindingValidationError设置了出现异常的事件处理程序,showError方法的第2个参数类型为ValidationErrorEventArgs, 可通过访问该参数获取相关信息,

  1. public void showError(object sender,ValidationErrorEventArgs e) 
  2.  
  3.     //异常不会冒泡 
  4.  
  5.       e.Handled = true
  6.  
  7.     if (e.Action == ValidationErrorEventAction.Added) 
  8.  
  9.     { 
  10.  
  11.      (e.OriginalSource as TextBox).Text = "**Error**";            } 
  12.  

 

ValidationErrorEventAction枚举包含2个值:Added  新验证错误已经信号

                                                           Removed  之前的错误输入已经纠正

运行后,当输入的值为空时,异常会抛出(F5忽略该异常),单击前进或后退,返回该记录时,文本会发送改变 

本站热点业务

更多模板/案例展示

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