提问者:小点点

如何获得验证状态在WPF中何时发生了更改?


Hi有一个使用mvvm的应用程序,在XAML中有3个文本框,所有这些文本框都需要不为空,底部有一个按钮是submit,我已经实现了一个验证器,使得当文本框不为空时,在UI中用红色边框显示错误,我想要的是,当文本框处于错误状态时,也禁用submit按钮

我尝试的一种方法是像这样实现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

我可以手动检查文本框是否为空,因为它们是绑定到属性的,我也可以使用属性绑定submit按钮的isEnabled属性,但是IDataErrorInfo中的方法不会每次验证状态发生更改时都被点击。

基本上,我不能让submit后面的方法执行,除非表单是有效的,并且这样做的方式不会中断线上的事情


共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()的setter中添加这个额外的调用;

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;
}