4

在我目前的项目中,我必须处理 WPF 表单中的数据验证。我的表单位于 ResourceDictionnary 的 DataTemplate 中。我可以通过两个按钮来保存和加载表单中的数据,这两个按钮可以序列化和反序列化数据(通过两个DelegateCommand)。

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

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

<TextBox>
    <Binding Path="Contact.FirstName" UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
            <ExceptionValidationRule/>
        </Binding.ValidationRules>
    </Binding>
</TextBox>

在此博客中,我们可以阅读:

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

我已经阅读了这篇文章,但我不能使用它,我的 TextBox 在 DataTemplate 中,我不能在我的 C# 代码中使用它们。

所以,我想知道我是否应该更改我的数据验证并且不要使用 ExceptionValidationRule。

4

1 回答 1

6

谢谢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>
于 2013-03-04T14:01:57.987 回答