0

我已经使用ValidationRule类在 wpf 文本框上应用了必填字段验证的 验证。我的代码是:

public class RequiredField : ValidationRule
{
    private String _errorMessage = String.Empty;
    public string ErrorMessage
    {
        get { return _errorMessage; }
        set { _errorMessage = value; }
    }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        var str = value as string;

        if (String.IsNullOrEmpty(str))
        {
            return new ValidationResult(false, this.ErrorMessage);
        }
        return new ValidationResult(true, null);
    }
}

XAML 代码如下:

<TextBox  Name="txtName"  MaxLength="50">
    <TextBox.Text>
        <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
            <Binding.ValidationRules>
                <myValidtaion:RequiredField ErrorMessage="Please enter Name." />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

这似乎工作正常。但问题是,在我将有效数据保存在数据库中并清除数据库后,再次触发此验证并再次出现验证消息。

我怎样才能避免这种情况?

4

1 回答 1

0

这似乎是一个常见的验证“问题”,但实际上它是 WPF 验证的预期行为……这也发生在使用IDataErrorInfo界面时。

这两种验证方法都会在它们的值发生变化时验证它们指定的属性,这正是我们想要的(大多数时候)。

我相信该系统被称为预测验证,它使我们能够在用户尝试保存之前向用户展示他们必须填写的内容。我个人认为这是一个比让用户尝试保存有错误的字段然后告诉他们他们犯了错误的旧系统更好的系统

也许您可以延迟清除字段,直到用户单击一个New按钮,在这种情况下,错误只会出现在那个时候?

更新>>>

如果您要使用该IDataErrorInfo接口,那么您可以bool IsValidating向您的数据类型类添加一个属性,您可以使用它来打开和关闭验证。我没有太多时间,所以我找到了一个实现这个接口的帖子,我已经适应了它来证明我的观点。

public class Person : IDataErrorInfo
{
    private int age;
    private bool isValidating = true;

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    public bool IsValidating 
    {
        get { return isValidating; }
        set { isValidating = value; }
    }     

    public string Error
    {
        get
        {
            return this["Age"];
        }
    }

    public string this[string name]
    {
        get
        {
            string result = null;
            if (IsValidating)
            {
                if (name == "Age")
                {
                    if (this.age < 0 || this.age > 150)
                    {
                        result = "Age must not be less than 0 or greater than 150.";
                    }
                }
            }
            return result;
        }
    }
}

改编自手动发布创建 WPF 验证错误的已接受答案中的代码

当您将此IsValidating属性切换为false时,不会验证属性更改:

person.IsValidating = false;
于 2013-10-14T09:39:11.880 回答