WPF中的验证问题

WPF中的验证问题,wpf,validation,Wpf,Validation,我已经使用ValidationRule类在wpf文本框上应用了必需字段验证的验证。我的代码是: public class RequiredField : ValidationRule { private String _errorMessage = String.Empty; public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = va

我已经使用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>

这似乎很有效。但问题是,在我将有效数据保存到数据库并清除数据库后,会再次触发此验证,并再次显示验证消息


如何避免这种情况?

这似乎是一个常见的验证“问题”,但实际上这是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;
        }
    }
}

您能在
验证中设置断点并提供调用堆栈吗?您的意思是清除字段,而不是我猜的数据库?因为如果这就是你的意思,它会将其视为一种改变,从而再次验证它。。。有点sense@Noctis,我理解,但我想阻止这种情况。Milie,调用堆栈没有大的信息REMTools.dll!REMTools.RequiredField.Validate(对象值,System.Globalization.CultureInfo CultureInfo)第27行C#我是否遗漏了任何内容?嗯……但在用户单击“新建”按钮之前,延迟字段的清除不是一件好事。我想应该有办法把它修好。
person.IsValidating = false;