博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WPF ErrorTemplate数据绑定

Posted on 2011-09-05 21:53  woshixdl  阅读(953)  评论(0编辑  收藏  举报

在文本框验证中,如果不符合验证规则,则相应的要给出提示,说明无法提交的原因,在WPF中文本框验证可通过ErrorTemplate来实现。
   先看一个MSDN的例子:http://msdn.microsoft.com/zh-cn/library/system.windows.controls.validation.errortemplate
   
   这个例子将验证失败提示绑定在文本框的ToolTip上,可以看到很容易就能实现,但是这个提示只在你鼠标放在该文本框上时才会显现出来,如果想让它像QQ的个人资料中的验证一样在该文本框下方或者附近显示一个具有特殊形状的提示(传不上图,不知道效果的可以到qq的基本资料页面,把昵称清空,然后保存,就会有那个验证提示了,呵呵),并且随着你的输入那个验证信息还能实时更新,WPF中同样可以实现,不同的是,在错误信息的绑定上就会有一些麻烦,我也不太会讲,看代码说话:
   先是我们的验证规则类:
 pubic class MobileValidationRule:ValidationRule
{
 private string email;
 private ValidationMessage validationmessage=null;
 public ValidationMessage Validationmessage
 {
  get{return validationmessage;}
  set{validationmessage=value;}
 }
 
 public override ValidationResult Validate(object value,System.Globalization.CultureInfo cultureInfo)
 {
  ValidationResult result=new ValidationResult(true,null);
  String str=value.ToString();
  if(string.IsNullOrEmpty(str))
  {
   if(this.validationmessage!=null)
   {
    this.validationmessage="手机号码不能为空";
   }
   result=new ValidationResult(false,"手机号码不能为空");
  }
  else if(!this.IsLegalMobile(str))
  {
   if(this.validationmessage!=null)
   {
    this.validationmessage.ErrorMsg="手机号码格式不正确";
   }
   result=new Validationresult(false,"手机号码格式不正确");
  }
  return result;//这个返回值在本例中其实是没有起到实际作用的,重要的是上边对this.validationmessage.ErrorMsg的赋值,后边会说到
 }
 public bool IsLegalMobile(string str)
 {
  return Regex.IsMatch(str,@"0?(1[3589]\d{9})$");
 }
}
public class ValidationMessage:INotifyPropertyChanged
{
 public event PropertyChangedEventHadler PropertyChanged;
 private string errorMsg;
 public String ErrorMsg
 {
  get{return errorMsg;}
  set{errorMsg=value;
  OnNotifyPropertyChanged("ErrorMsg");}
 }
 
 public void OnNotifyPropertyChanged(string propertyName)
 {
  if(PropertyChanged!=null)
  {
   PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
  }
 }
 
}
很容易可以看出MobileValidationRule类是验证文本框输入的是否为以13/5/8/9开头的手机号码,而ValidationMessage则是保存验证失败提示信息,并负责提供数据绑定的类
   下边是Xaml代码:
   <validation:ValidationMessage x:Key="mobileValidationMsg"/>
   <Style x:Key="InputErrorTextBoxStyle" TargeType="TextBox">
 <Setter Property="Validation.ErrorTemplate">
  <Setter.Value>
   <ControlTemplate>
    <Grid ClipToBounds="False">
     <Grid.RowDefinitions>
      <RowDefinition Height="*"/>
      <RowDefinition Height="Auto"/>
     </Grid.RowDefinitions>
     <Border x:Name="PART_Border" BorderBrush="#7A7A7A" Grid.Row="0" BorderThickness="0" Margin="0">
      <AdornedElementPlaceholder Grid.Row="0" Name="adornedElement"/>
     </Border>
     <Border Grid.Row="1" BorderThickness="1" BorderBrush="Transparent" Width="130" Height="35" Margin="0,-11,0,0">
      <Border.Background>
       <ImageBrush ImageSource="{StaticResource PersonalInfoToolTipBG}"/>
      </Border.Background>
      <TextBlock Name="tbkErrorInfo" Foreground="#FF9537" Margin="5,8,0,0" VerticalAlignment="Center" HorizontalAlignment="Center" TextAlignment="Center">
       <TextBlock.Text>
        <Binding Path="ErrorMsg" Source="{StaticResource  mobileValidationMsg}" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay"/>
       </TextBlock.Text>
      </TextBlock>
     </Border>
    </Grid>
   </ControlTemplate>
  </Setter.Value>
 </Setter>
</Style>
<TextBox Name="txtMobile" BorderBrush="#7A7A7A" BorderThickness="1" Width="182" MaxLength="12" Style="{StaticResource InputErrorTextBoxStyle}">
 <TextBox.Text>
  <Binding Path="Mobile" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource textboxConvert}">
   <Binding.ValidationRules>
    <validation:MobileValidationRule ValidationMessage="{StaticResource mobileValidationMsg}"/>
   </Binding.ValidationRules>
  </Binding>
 </TextBox.Text>
</TextBox>
上述前端代码,首先定义ValidationMessage类型的全局资源mobileValidationMsg,然后定义了验证失败时的文本框样式,文本框txtMobile先绑定其文本数据源为Mobile(这个大家可以自己写个类用以保存手机号)在绑定验证规则时,将全局资源mobileValidationMsg传入MobileValidationRule对象中,这样在ErrorTemplate模板中就可以使用该资源保存的验证失败信息进行绑定了,接下来就如InputErrorTextBoxStyle中那样给tbkErrorInfo绑定数据源mobileValidationMsg,并设置Path为ErrorMsg就可以实现验证失败信息的实时更新

第一次写东西,太乱,唉...