WPF验证错误

WPF验证错误,wpf,validation,data-binding,validationrule,Wpf,Validation,Data Binding,Validationrule,在我当前的项目中,我必须处理WPF表单中的数据验证。我的表单位于ResourceDictionary中的数据模板中。由于有两个按钮,我可以从表单中保存和加载数据,这两个按钮可以序列化和反序列化数据(通过两个按钮) 如果我表单的一个字段为空或无效,则“保存”按钮为“禁用”。由于UpdateSourceTrigger属性,每次更改字段时都会对其进行检查。这就是为什么我需要在我的C代码中知道一个字段是否无效,以更新我的save命令 目前,我在XAML绑定中使用ExceptionValidationRu

在我当前的项目中,我必须处理WPF表单中的数据验证。我的表单位于ResourceDictionary中的数据模板中。由于有两个按钮,我可以从表单中保存和加载数据,这两个按钮可以序列化和反序列化数据(通过两个按钮)

如果我表单的一个字段为空或无效,则“保存”按钮为“禁用”。由于UpdateSourceTrigger属性,每次更改字段时都会对其进行检查。这就是为什么我需要在我的C代码中知道一个字段是否无效,以更新我的save命令

目前,我在XAML绑定中使用ExceptionValidationRule,我想知道这是否是一个好的实践。我无法实现ValidationRule,因为我需要在C#代码中知道字段是否无效,以更新save命令(启用或禁用save按钮)


在这方面,我们可以阅读:

在setter中引发异常不是一种很好的方法,因为这些属性也是由代码设置的,有时可以暂时将它们保留为错误值

我已经读过了,但是我不能使用它,我的文本框在数据模板中,我不能在我的C代码中使用它们

因此,我想知道是否应该更改数据验证,不要使用ExceptionValidationRule。

谢谢,你的想法很好。 IDataErrorInfo似乎比ExceptionValidationException更好,而且它很有效

下面是一个与我的项目相匹配的示例:

它不使用DelegateCommand,但非常简单,可以修改。您的模型必须实现IDataErrorInfo:

public class Contact : IDataErrorInfo
{

    public string Error
    {
        get { throw new NotImplementedException(); }
    }

    public string Name { get; set; }

    public string this[string property]
    {
        get 
        {
            string result = null;
            if (property== "Name")
            {
                if (string.IsNullOrEmpty(Name) || Name.Length < 3)
                    result = "Please enter a Name";
            }
            return result;
        }
    }

}
公共类联系人:IDataErrorInfo
{
公共字符串错误
{
获取{抛出新的NotImplementedException();}
}
公共字符串名称{get;set;}
公共字符串此[字符串属性]
{
得到
{
字符串结果=null;
如果(属性==“名称”)
{
if(string.IsNullOrEmpty(Name)| | Name.Length<3)
结果=“请输入名称”;
}
返回结果;
}
}
}
在XAML代码中,不要忘记更改绑定:

<TextBox>
    <Binding Path="Contact.Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
</TextBox>


您尝试过IDataErrorInfo和MVVM吗?是的,我已经在使用MVVM了。IDataErrorInfo似乎是一个很好的解决方案。。。它会比ExceptionValidationRule好吗?我会说是的,但它也有它的缺点。特别是如果您的vw中的属性类型不是字符串。我们在我们的项目中使用idataerrorinfo,它很有效
<TextBox>
    <Binding Path="Contact.Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
</TextBox>