- A+
所属分类:.NET技术
WPF输入验证提示
在写前端输入时,我们经常要对用户的输入进行验证,检查输入的合理性,当输入非法时,需要能提醒用户。比如下图,当输入不是IP格式的字符串时,会提示输入正确格式的IP。
百度一圈得到的做法:
前端
<TextBox Text="{Binding MccIP,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}" Style="{StaticResource txtboxValiStyle}" BorderThickness="0" Width="100" Height="30" Margin="5"/>
样式
<!--textbox验证style--> <Style x:Key="txtboxValiStyle" TargetType="TextBox"> <Setter Property="FontSize" Value="16"/> <Setter Property="Height" Value="34"/> <Setter Property="Width" Value="140"/> <Setter Property="Margin" Value="3 12 3 0"/> <Setter Property="VerticalContentAlignment" Value="Center"/> <Setter Property="HorizontalContentAlignment" Value="Center"/> <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="Validation.ErrorTemplate"> <Setter.Value> <ControlTemplate> <DockPanel LastChildFill="True"> <TextBlock DockPanel.Dock="Bottom" Background="Red" Foreground="White" FontSize="12" Height="14" Width="Auto" VerticalAlignment="Center" TextAlignment="Center" TextWrapping="Wrap" FontFamily="Arial" Text="{Binding ElementName=ErrorBox, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"> </TextBlock> <AdornedElementPlaceholder Name="ErrorBox" /> </DockPanel> </ControlTemplate> </Setter.Value> </Setter> </Trigger> </Style.Triggers> </Style>
在样式中判断,Property="Validation.HasError" Value="true",触发样试更改。
后端
测试使用的MVVM框架为Caliburn.Micro
using Caliburn.Micro; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; namespace DataError.ViewModels { public class MainViewModel : Screen, INotifyPropertyChanged, IDataErrorInfo { private string mccIP; [Required] [RegularExpression(@"^((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)$", ErrorMessage = "请输入正确格式的IP地址!")] public string MccIP { get { return mccIP; } set { mccIP = value; NotifyOfPropertyChange(); } } #region 实现IDataErrorInfo接口 public string Error { get { return null; } } public string this[string columnName] { get { var vc = new ValidationContext(this, null, null); vc.MemberName = columnName; var res = new List<ValidationResult>(); var result = Validator.TryValidateProperty(this.GetType().GetProperty(columnName).GetValue(this, null), vc, res); if (res.Count > 0) { return string.Join(Environment.NewLine, res.Select(r => r.ErrorMessage).ToArray()); } return string.Empty; } } #endregion } }
首先在ViewModel的类中需继承IDataErrorInfo接口,并在类中实现IDataErrorInfo接口,然后使用正则表达式判断字符串格式,如果格式不匹配,输出错误消息,如下图。