当前位置: 首页 > 知识库问答 >
问题:

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

逑翰翮
2023-03-14

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个答案

苗运珧
2023-03-14

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

<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;
}
 类似资料:
  • 您可能知道,在正常模式下,当状态更新时,我们使用更新依赖项来获得通知,如下所示: 但在我的例子中,我的状态中有一个数组,我正在尝试在useEffect的循环中更新它,如下所示: 在本例中,每次forEach循环运行时,我都会得到初始val(我知道,因为val不是useffect的依赖项),但如果我将其作为依赖项,它将更新两次。解决这个问题的办法是什么? 编辑:基本上,我的意思是,当我在useffe

  • 问题内容: 我想检查用户在程序启动时是否按下了 Shift 键。(这意味着在程序启动前先按 Shift 键)这是一个简单的控制台程序,与X无关。 这可能类似于Win32 函数。 我想知道我是否可以做到这一点以及如何做到,但是不知道直接访问终端有什么利弊。 问题答案: 你不能 该键不被视为字符键,因此,即使您直接访问终端,也将无法检测到该键。 也许您不必。例如,假设您使用的是美式键盘,其中第一行中的

  • 我有一个组件,看起来像: 它从datepicker组件获取currentDate属性,如下所示: 当我从日期选择器中选择新日期时,this.props.current子组件上的日期会更新。这是我想要的日期。但是,当更新该prop时,它不会用新的预期数据重新呈现表。我意识到我必须更新子表的状态才能重新渲染。我试图通过设置当前日期:this.props.current日期来设置ftchData()方法

  • 问题内容: 我知道如何使用$?检查先前执行的命令的状态,我们可以使用exit命令使该状态成为当前状态。但是对于bash中的循环,总是返回状态0,有什么办法可以使循环中断某些状态。 问题答案: 循环的状态是最后执行的命令的状态。您可以使用break中断循环,但如果中断成功,则循环状态为。但是,您可以使用子shell并退出而不是中断。换一种说法: 您也可以将循环放入函数中并从中返回一个值。

  • 在我的项目中,如何键盘大写锁定状态。我已经提到了这个问题,我如何才能获得Caps锁定状态,并将其设置为on,如果它还没有?。但我得到的是JavaFX解决方案。请给我解决方案。我也是此站点https://community.oracle.com/thread/2415027?tstart=0的引用者

  • 在执行测试之后,我将获得目录中的XML文件。在这里,我使用以下命令生成HTML报告: 在中,我有一个文件,它用于根据HTML报告的结果(例如:通过、中断、失败、...)对测试进行分类。我相信这种分类是由诱惑力完成的。 所以我想知道这种分类有什么诱惑力。