DataContext 中的 WPF 数据验证?

WPF Data Validation inside of your DataContext?

我正在使用自定义 ValidationRule 来验证输入到 TextBox 中的数据。

<TextBox>
    <Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
            <util:AlphanumericValidationRule/>
            <util:StringLengthIfEnteredRule Min="1"/>
        </Binding.ValidationRules>
    </Binding>
</TextBox>

这可以很好地验证是否只输入了一个字母数字字符串,并且它的长度大于或等于 1。

问题是此 TextBox 所属的表单有一个 "Submit" 按钮,该按钮绑定到 DataContext 内的一个函数。因此,当他们点击提交时,我希望能够知道我的所有字段在数据上下文中是否有效。

我已经对此进行了一些研究,我看到的最好方法是检查代码隐藏文件中的表单是否存在任何错误,并将该信息传递给您的 DataContext .这个解决方案不太理想,所以我想知道是否有某种可绑定的 属性 或我错过的可以提供此功能的东西?

tl;dr 如何告诉我的 DataContext 是否使用 XAML?

验证了字段

我发现执行此操作的最佳方法是实施 IDataErrorInfo。示例如下。

XAML

<TextBox Text="{Binding Name, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"/>

数据上下文

using System.ComponentModel;

class ViewModel, IDataErrorInfo
{
    public string Name {get;set;}

    private bool formContainsErrors;
    private string formError;
    private AlphanumericValidationRule alphanumericValidation;

    public ViewModel()
    {
        this.alphanumericValidation = new AlphanumericValidationRule();
        this.formContainsErrors = false;
    }

    public string Error
    {
        get { return this.formError; }
    }

    public string this[string columnName]
    {
        get
        {
            this.formError = null;
            switch (columnName)
            {
                case "Name":
                    this.formError = (string)this.alphanumericValidation.Validate(this.Name, null).ErrorContent;
                    break;
            }
            this.formContainsErrors = (this.formError != null);
            return this.formError;
        }
    }
}

有了这个,您可以检查 "formContainsErrors" 以了解您的来源是否包含错误