WPF验证无效

时间:2013-05-02 17:18:53

标签: c# wpf validation

我创建了一个WPF,用于从客户端获取序列号。作为过程的一部分,我试图验证它,以便每个段的长度正好是5个字符长,所有字符都是字母或数字。我按照here给出了大纲。

问题是它似乎没有做任何事情,我也按照提交按钮的说明进行操作,它将提交不正确的数据,而它似乎不应该验证值是否不是对。这与绑定Path有什么关系吗?如果没有,为什么我的字段不会验证?

ValidationRule的代码如下所示:

namespace Syncagent.Installer
{
class LicenseValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if(!(value.ToString().Length == 5))
            return new ValidationResult(false,"Incorrect number of characters.");

        Regex rExp = new Regex("^[A-Z0-9]*$");
        if (!rExp.IsMatch(value.ToString().ToUpper()))
        {
            return new ValidationResult(false,"A key may contain only numbers and letters.");
        }

        return new ValidationResult(true, null);
    }
}
}

这是XAML:

<Window x:Name="wFusionKey" x:Class="SyncAgent.Installer.KeyForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SyncAgent.Installer"
    Title="FusionKeyForm" Height="158" Width="338" ResizeMode="NoResize">
<Grid Margin="0,0,-6,1" HorizontalAlignment="Left" Width="334">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="0*"/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Button x:Name="btnOkay" Content="Submit" HorizontalAlignment="Left" Margin="166,96,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1" Height="22" IsDefault="True" Click="btnOkay_Click"/>
    <Label x:Name="lblFusionLicenseKey" Content="Please enter your 25-digit Fusion License Key here." HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Grid.Column="1" Height="26" Width="278"/>
    <TextBox x:Name="txtFusion1" HorizontalAlignment="Left" Height="23" Margin="10,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="51" Grid.Column="1" MaxLength="5" MaxWidth="Infinity">
        <TextBox.Text>
            <Binding Path="/" Mode="default" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <local:LicenseValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <Button x:Name="btnCancel" Grid.ColumnSpan="2" Content="Cancel" HorizontalAlignment="Left" Margin="246,96,0,0" VerticalAlignment="Top" Width="75" IsCancel="True"/>
    <TextBox x:Name="txtFusion2" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="76,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5">
        <TextBox.Text>
            <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <local:LicenseValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBox x:Name="txtFusion3" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="141,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5">
        <TextBox.Text>
            <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <local:LicenseValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBox x:Name="txtFusion4" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="206,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5" RenderTransformOrigin="1.491,0.522">
        <TextBox.Text>
            <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <local:LicenseValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBox x:Name="txtFusion5" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="271,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5">
        <TextBox.Text>
            <Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
                <Binding.ValidationRules>
                    <local:LicenseValidationRule/>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>

1 个答案:

答案 0 :(得分:2)

我不确定你的TextBox绑定了什么,因为我看不到你的代码,但是当你的TextBox文本被绑定到字符串时,验证器似乎工作正常。

以下是附加到TextBox的Validator的简单示例,该TextBox绑定到字符串。

代码:

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
    private string _myTextToValidate;
    public MainWindow()
    {
        InitializeComponent();
    }

    public string MyTextToValidate
    {
        get { return _myTextToValidate; }
        set { _myTextToValidate = value; NotifyPropertyChanged("MyTextToValidate"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}

的Xaml:

<Window x:Class="WpfApplication11.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication11"
        Title="MainWindow" Height="89" Width="166" Name="UI">

    <Grid DataContext="{Binding ElementName=UI}">
        <TextBox Height="23" Margin="12" >
            <TextBox.Text>
                <Binding Path="MyTextToValidate" UpdateSourceTrigger="PropertyChanged">
                    <Binding.ValidationRules>
                        <local:LicenseValidationRule/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox.Text>
        </TextBox>
    </Grid>
</Window>

这可能有助于追踪您的问题。