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