WPF中TextBox输入框利用Validation进行数据验证

//继承一个ValidationRule,重写Validate方法
public class NumberValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            double myValue = 0;
            if (double.TryParse(value.ToString(), out myValue))
            {
                if (myValue >= 0 && myValue <= 100)
                {
                    return new ValidationResult(true, null);
                }
            }

            return new ValidationResult(false, "请输入 0 至 100的数字");
        }
    }

前端XAML代码调用上面的类,并自定义错误提示模板

 <TextBox x:Name="_textbox" Width="191" Height="30" Canvas.Left="41" Canvas.Top="25">
     <TextBox.Text>
         <Binding Path="Number" UpdateSourceTrigger="PropertyChanged">
             <Binding.ValidationRules>
                 <validation:NumberValidationRule ValidatesOnTargetUpdated="True" />
             </Binding.ValidationRules>
         </Binding>
     </TextBox.Text>
     <Validation.ErrorTemplate>
         <ControlTemplate>
             <StackPanel Orientation="Horizontal" x:Name="_stack">
                 <Border>
                     <Grid>
                         <AdornedElementPlaceholder x:Name="adorner"/>
                     </Grid>
                 </Border>
                 <Grid Width="10"/>
                 <Popup x:Name="popup" AllowsTransparency="True" Placement="Left" >
                     <Border x:Name="errorBorder" Background="#ffdc000c" Opacity="0" MinHeight="30" >
                         <TextBlock Margin="5,0" Text="{Binding ElementName=adorner, Path=AdornedElement.(Validation.Errors).CurrentItem.ErrorContent}" Foreground="White" TextWrapping="Wrap" VerticalAlignment="Center"/>
                     </Border>
                 </Popup>
             </StackPanel>
             <ControlTemplate.Triggers>
                 <DataTrigger Value="True" Binding="{Binding ElementName=adorner,Path=AdornedElement.IsKeyboardFocused}">
                     <!--<DataTrigger.Binding>
                         <Binding ElementName="adorner" Path="AdornedElement.IsKeyboardFocused" />
                     </DataTrigger.Binding>-->

                     <DataTrigger.Setters>
                         <Setter Property="IsOpen" TargetName="popup" Value="true"/>
                     </DataTrigger.Setters>
                     <DataTrigger.EnterActions>
                         <BeginStoryboard x:Name="fadeInStoryboard">
                             <Storyboard>
                                 <DoubleAnimation Duration="00:00:00.15" Storyboard.TargetName="errorBorder" Storyboard.TargetProperty="Opacity" To="1"/>
                             </Storyboard>
                         </BeginStoryboard>
                     </DataTrigger.EnterActions>
                     <DataTrigger.ExitActions>
                         <StopStoryboard BeginStoryboardName="fadeInStoryboard"/>
                         <BeginStoryboard x:Name="fadeOutStoryBoard">
                             <Storyboard>
                                 <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="errorBorder" Storyboard.TargetProperty="Opacity" To="0"/>
                             </Storyboard>
                         </BeginStoryboard>
                     </DataTrigger.ExitActions>
                 </DataTrigger>
             </ControlTemplate.Triggers>
         </ControlTemplate>
     </Validation.ErrorTemplate>
 </TextBox>

Binding Path="Number"中的Number是当前UI的DataContext中的一个属性,DataContext来源于一个ViewModel

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值