WPF 自動驗證


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>
View Code

 

第二步:綁定上面的樣式:

<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);
        }
    }
}
View Code

綁定規則:

                            <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>
View Code

 

 

【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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM