如何让视图模型知道已成功验证的表单

本文关键字:成功 验证 表单 视图 模型 | 更新日期: 2023-09-27 18:32:32

我有一个注册表,字段很少。这是一个PRISM MVVM应用程序。

其中一个字段的 XAML 如下所示 (RegisterView.xaml(:

<TextBlock>Surname</TextBlock>
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"      HorizontalAlignment="Left" Margin="0" Name="Surname" VerticalAlignment="Top" >
    <TextBox.Text>
        <Binding Path="Surname" UpdateSourceTrigger="LostFocus" >
            <Binding.ValidationRules>
                 <val:Required />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

从上面的代码中可以看出,我使用类 Required 来验证字段。类 Required 的函数 Validate(( 然后返回ValidationResult对象。我还为输入的样式定义了一些触发器,因此我能够在视图中向用户显示验证结果。

我不知道的是,如何检测ViewModel中所有输入的验证状态。在ViewModel中,我有一个SaveUserCanExecute功能,它应该在所有输入的验证状态上启用/禁用基本注册表单提交按钮。

那么有没有简单的方法可以实现这一目标呢?

我可以为此做一些解决方法,但我认为这不是正确的方法。

现在,我在提交按钮的 Click 事件触发的视图代码中创建了一个Submit_Click函数。

在 RegisterView.xaml 中

<Button Content="Register" HorizontalAlignment="Left" Margin="0" Name="Submit" VerticalAlignment="Top" Command="{x:Static inf:Commands.SaveUser}" Click="Submit_Click" />

我还在代码隐藏中创建新的公共布尔变量"formIsValid"。按下提交按钮时,我检查所有输入是否没有验证错误(使用Validation.GetHasError(InputName)函数(。如果是这样,我将formIsValid变量设置为 true,否则,我将其设置为 false。

在 RegisterView.xaml 中.cs

private void Submit_Click(object sender, RoutedEventArgs e)
{
    if (Validation.GetHasError(Firstname) == false && Validation.GetHasError(Surname) == false)
    {
        registerFormValid = true;
    }
    else
    {
        registerFormValid = false;
    }
}

然后在 ViewModel 中SaveUserCanExecute函数如下所示:

private bool SaveUserCanExecute(string parameter)
{
    if (View.registerFormValid == true)
    {
        return true;
    }
    return false;
}

但正如我之前提到的,我认为这不是正确的方法,我正在寻找一些更清晰的方法。

如何让视图模型知道已成功验证的表单

ViewModel中实现IDataErrorInfo,那么你在VM中就有了所需的所有信息。你的 XAML 只需要 ValidatesOnDataErrors=true

<TextBlock>Surname</TextBlock>
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"      HorizontalAlignment="Left" Margin="0" Name="Surname" VerticalAlignment="Top" >
        <TextBox.Text>
            <Binding Path="Surname" UpdateSourceTrigger="LostFocus" ValidatesOnDataErrors="True">
            </Binding>
        </TextBox.Text>
 </TextBox>

编辑:检查DelegeCommand的使用,然后你的命令CanExecute可以简单地检查字符串。IsNull或Empty(this.错误(。

将命令 (ICommand( 绑定到提交按钮,并在其 CanExecute 方法中实现此逻辑。这是一个经典的 ICommand 实现。