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后面的方法执行,除非表单是有效的,并且这样做的方式不会中断线上的事情
确保文本框的绑定支持验证状态更改:
<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;
}