Silverlight 支持基本的数据验证,在TwoWay双向绑定中可以验证你输入数据的合法性。
要验证数据,必须要将绑定对象上的ValidatesOnExceptions属性设置为True,NotifyOnValidationError属性设置为True。ValidatesOnExceptions的作用是通知绑定引擎在发生异常时创建验证错误。NotifyOnValidationError属性的作用是在发生异常时引发BindingValidationError事件。
下面是代码,首先创建一个Book_Val类如下代码:
ublic class Book_Val : INotifyPropertyChanged { //book继承了INotifyPropertyChanged,实现了PropertyChanged事件,并对Price属性添加了监视 /// <summary> /// 标题 /// </summary> public string Title { get; set; } private double _price; /// <summary> /// 价格 /// </summary> public double Price { get { return _price; } set { if (value < 0) { throw new Exception("单价不能为负数,请重新输入!"); } _price = value; NotifyProperyChanged("Price"); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyProperyChanged(string PropertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); } } }
在XAML中把价格绑定到TextBox上
XAML:
<Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="50" /> <RowDefinition Height="50"/> <RowDefinition Height="50"/> <RowDefinition Height="70"/> </Grid.RowDefinitions> <StackPanel Orientation="Horizontal" VerticalAlignment="Center" Grid.Row="0" Width="300"> <TextBlock FontSize="17" Text="书名:" Width="70" Margin="10,0,0,0" /> <TextBlock x:Name="txb_Title" FontSize="17" Text="{Binding Title,Mode=OneWay}" /> </StackPanel> <StackPanel Orientation="Horizontal" VerticalAlignment="Center" Grid.Row="1" Width="300"> <TextBlock FontSize="17" Text="单价:" Width="70" Margin="10,0,0,0" /> <TextBlock x:Name="txb_OldPrice" FontSize="17" Text="{Binding Price,Mode=TwoWay}" /> </StackPanel> <StackPanel Orientation="Horizontal" VerticalAlignment="Center" Grid.Row="2" Width="300"> <TextBlock FontSize="17" Text="新单价:" Width="70" Margin="10,0,0,0" /> <TextBox x:Name="txt_Price" Width="200" Text="{Binding Price,Mode=TwoWay,NotifyOnValidationError=True, ValidatesOnExceptions=True}" BindingValidationError="txt_Price_BindingValidationError" FontSize="17"/> </StackPanel> <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Grid.Row="3"> <Button x:Name="btn_Edit" Click="btn_Edit_Click" Content="修 改" FontSize="17" Width="100" /> </StackPanel> </Grid>
后台C#代码:
Book_Val book = new Book_Val(); public DataValidation() { InitializeComponent(); book.Title = "Silverlight开发历程!"; book.Price = 80; txb_Title.DataContext = book; txb_OldPrice.DataContext = book; txt_Price.DataContext = book; } private void txt_Price_BindingValidationError(object sender, ValidationErrorEventArgs e) { //修改txt_Price背景框的颜色 if (e.Action == ValidationErrorEventAction.Added) { txt_Price.Background = new SolidColorBrush(Colors.Red); } else if (e.Action == ValidationErrorEventAction.Removed) { txt_Price.Background = new SolidColorBrush(Colors.White); } } private void btn_Edit_Click(object sender, RoutedEventArgs e) { book.Price = Convert.ToDouble(txt_Price.Text); }
运行如结果:
出错的时候报错:
这个例子就完了,但是个人感觉不太好因为在调试环境下他总是会报出异常错误,即使在平常浏览状态下,他仍然会报出调试窗口,我也在网上找了资料,很多都是把调试功能
给去掉了,并没有从根本上解决这个问题,所以个人感觉这个验证直接throw出异常不太好,也许是我个人没有学习到位,希望朋友们如果知道其它更好的验证方法的话,请给我留言,谢谢。