在我当前的项目中,我必须处理WPF表单中的数据验证。我的表单是在一个数据模板在一个资源字典。由于两个按钮(通过两个DelegateCommand)序列化和反序列化数据,我可以保存和加载表单中的数据。
如果我的表单的一个字段是空的或无效的,保存按钮被禁用。由于UpdateSourceTrigger属性,每次更改时都会检查字段。这就是为什么我需要知道在我的c#代码中,如果一个字段是无效的更新我的保存命令。
目前,我在我的XAML绑定中使用ExceptionValidationRule,我想知道这是否是一个好的实践。我不能实现ValidationRule,因为我需要在c#代码中知道字段是否无效,以更新保存命令(启用或禁用保存按钮)。
<TextBox>
<Binding Path="Contact.FirstName" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox>
在这个博客中,我们可以阅读:
在setter中引发异常不是一个很好的方法,因为这些属性也是由代码设置的,有时可以暂时将它们保留错误值。
我已经读了这篇文章,但我不能使用它,我的文本框是在一个DataTemplate,我不能在我的c#代码中使用它们。
所以,我想知道我是否应该改变我的数据验证和不使用ExceptionValidationRule。
谢谢你,blindmeis,你的主意很好。IDataErrorInfo似乎比ExceptionValidationException更好,它工作。
下面是一个与我的项目相匹配的例子:IDataErrorInfo示例它不使用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;
}
}
}
在XAML代码中,不要忘记更改Binding:
<TextBox>
<Binding Path="Contact.Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
</TextBox>