【问题标题】:WPF Data Validation inside of your DataContext?DataContext 中的 WPF 数据验证?
【发布时间】:2015-05-11 16:40:09
【问题描述】:

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

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

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

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

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

tl;dr 如何告诉我的 DataContext 字段是否使用 XAML 进行验证?

【问题讨论】:

    标签: c# wpf validation xaml datacontext


    【解决方案1】:

    我发现最好的方法是实现 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”来了解你的from是否包含错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多