【问题标题】:How to get when the validation state has changed in wpf?如何在 wpf 中更改验证状态?
【发布时间】:2021-07-24 13:20:43
【问题描述】:

您好,有一个使用 MVVM 的应用程序,XAML 中有 3 个文本框,所有这些文本框都必须不为空,底部有一个提交按钮,我已经实现了一个验证器,以便文本框当它们不为空时,在带有红色边框的 UI 中显示错误,我想要的是,当文本框处于错误状态时也禁用提交按钮

我尝试的一种方法是像这样实现IDataErrorInfo

#region IDataErrorInfo Members

        public string Error
        {
            get { return null; }
        }

        public string this[string propertyName]
        {
            get
            {
                //Code here to manually disable the submit button, if the fields are empty
                return null;
            }
        }
#endregion

我可以手动检查文本框是否为空,因为它们已绑定到属性,我还可以使用属性将提交按钮的 isEnabled 属性绑定相同,但 IDataErrorInfo 中的方法只是没有每次验证状态更改时都不会受到影响。

基本上我不能让 submit 后面的方法执行,除非表单是有效的并且以一种不会破坏线的方式来执行

【问题讨论】:

    标签: c# wpf validation mvvm error-handling


    【解决方案1】:

    确保您的文本框的绑定支持验证状态更改:

    <TextBox Text="{Binding MyProperty, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True, ValidatesOnDataErrors=True}"
    <Button Content="Submit" Command="{Binding SubmitCommand}"
    

    定义您的命令以包含 CanExecute 方法:

    public ICommand SubmitCommand
    {
        get
        {
            return _submitCommand ?? (_submitCommand = new RelayCommand(ExecuteSubmitCommand, CanExecuteSubmitCommand));
        }
    }
    

    在属性的设置器中添加这个额外的调用 _submitCommand?.RaiseCanExecuteChanged();

    public string MyProperty
    {
        get { return _myProperty; }
        set
        {
            _myProperty = value;
            OnPropertyChanged(nameof(MyProperty));
            _submitCommand?.RaiseCanExecuteChanged();
        }
    }
    

    然后在您的视图模型中验证您的值并将其验证结果保存在一些 bool 字段中:

    public string this[string propertyName]
    {
        get
        {
            if (propertyName == nameof(MyProperty))
            {
                _isValidMyProperty = !string.IsNullOrWhiteSpace(MyProperty);
                if (!_isValidMyProperty )
                {
                    return "Invalid value";
                }
            }
            return null;
        }
    }
    

    在 CanExecute 方法中返回 Submit 命令是否可以执行。该按钮将根据命令可用性自动启用/禁用:

    private bool CanExecuteSubmitCommand()
    {            
        return _isValidMyProperty;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-02
      • 2019-11-30
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2021-04-26
      • 2020-07-13
      • 1970-01-01
      相关资源
      最近更新 更多