WPF中TextBox的自動驗證:
演示 :
用以下兩個TextBox分別顯示驗證IP和非空值驗證,先看效果:
IP自動驗證效果:
非空值自動驗證效果:
第一步:定義TextBox驗證的樣式:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Style x:Key="ValidationTextBoxStyle" TargetType="{x:Type TextBox}"> <Setter Property="Validation.ErrorTemplate"> <Setter.Value> <ControlTemplate> <DockPanel LastChildFill="True"> <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="14" FontWeight="Bold" ToolTip="{Binding ElementName=adornerPlaceholder, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"> * </TextBlock> <Border BorderBrush="Red" BorderThickness="1" CornerRadius="3"> <AdornedElementPlaceholder Name="adornerPlaceholder"></AdornedElementPlaceholder> </Border> </DockPanel> </ControlTemplate> </Setter.Value> </Setter> <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> </Trigger> </Style.Triggers> </Style> </ResourceDictionary>
第二步:綁定上面的樣式:
<TextBox x:Name="TxDataBaseIP" Style="{DynamicResource ValidationTextBoxStyle}" ..... <TextBox x:Name="TbDataBaseAcount" Style="{DynamicResource ValidationTextBoxStyle}" ......
第三步:為Text的Text屬性定義和添加驗證規則:
定義驗證規則:

using System.Text.RegularExpressions; using System.Windows.Controls; namespace NCS.Client.WPF.Resources.Validations { public class NotNullValidationRule : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { if (string.IsNullOrEmpty(value as string) || string.IsNullOrWhiteSpace(value as string)) { return new ValidationResult(false, "不能為空!"); } return new ValidationResult(true, null); } } public class IPAddressRule : ValidationRule { public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { string IPAddress = value as string; if (!string.IsNullOrWhiteSpace(IPAddress)) { string IPAddressFormartRegex = @"^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$"; // 檢查輸入的字符串是否符合IP地址格式 if (!Regex.IsMatch(IPAddress, IPAddressFormartRegex)) { return new ValidationResult(false, "IP地址格式不正確"); } } return new ValidationResult(true, null); } } }
綁定規則:
<TextBox.Text>
<Binding Path="DataBaseIp" Mode="TwoWay"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<validations:IPAddressRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
<TextBox.Text> <Binding Path="DataBaseAccount" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <validations:NotNullValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text>
完整的控件xaml代碼:

<StackPanel Orientation="Horizontal" Height="30" VerticalAlignment="Top"> <TextBlock Text="數 據 庫 IP" Width="70" VerticalAlignment="Center"/> <TextBox x:Name="TxDataBaseIP" Style="{DynamicResource ValidationTextBoxStyle}" MaxWidth="150" Width="150" Height="25" HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBox.Text> <Binding Path="DataBaseIp" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <validations:IPAddressRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> </StackPanel> <StackPanel Orientation="Horizontal" Height="35" VerticalAlignment="Top"> <TextBlock Text="數據庫賬戶" Width="70" VerticalAlignment="Center"/> <TextBox x:Name="TbDataBaseAcount" Style="{DynamicResource ValidationTextBoxStyle}" MaxWidth="150" Width="150" Height="25" HorizontalAlignment="Center" VerticalAlignment="Center"> <TextBox.Text> <Binding Path="DataBaseAccount" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> <Binding.ValidationRules> <validations:NotNullValidationRule/> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> </StackPanel>
【the end】
后記:
1.有個缺陷的:一開始初始化界面的時候沒有進行驗證,必須是輸入一次,以后才進行驗證。如下圖所示:
2. 上面的文章描述是基於我的一個實際項目編寫的,有網友可能需要源碼,現在我從原來的項目中剝離出這部分知識的代碼部分,所以下載到的源碼與上述的代碼的
命名空間不一致。
源碼下載:
鏈接:http://pan.baidu.com/s/1jGE9V0q 密碼:05g3
拓展學習:
Regex Validation in WPF
http://www.codeproject.com/Articles/15610/Regex-Validation-in-WPF