Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让视图模型知道已成功验证的表单_C#_.net_Mvvm_Prism - Fatal编程技术网

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

C# 如何让视图模型知道已成功验证的表单,c#,.net,mvvm,prism,C#,.net,Mvvm,Prism,我有一张登记表,上面没有几个字段。它是一个prismmvvm应用程序 其中一个字段的XAML如下所示(RegisterView.XAML): 我还在代码隐藏中创建了新的公共布尔变量“formIsValid”。当按下submit按钮时,我检查所有输入是否没有验证错误(使用validation.GetHasError(InputName)函数)。如果是,我将formIsValid变量设置为true,否则,我将其设置为false 在RegisterView.xaml.cs中 private void

我有一张登记表,上面没有几个字段。它是一个
prismmvvm
应用程序

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

我还在代码隐藏中创建了新的公共布尔变量“formIsValid”。当按下submit按钮时,我检查所有输入是否没有验证错误(使用
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;
}

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

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

在您的ViewModel中实现IDataErrorInfo,然后您就可以在VM中获得所需的所有信息。您的XAML只需要validateSondaerRors=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就可以简单地检查string.IsNullOrEmpty(this.Error)。

这是我用一种稍微不同的方式做的。我已将复合命令绑定到我的提交按钮(请参阅command=“{x:Static-inf:Commands.SaveUser}”)。问题是,它的CanExecute函数在ViewModel中,所以我需要在那里获得有关所有输入验证的信息。或者我没有得到你的答案。不管怎样,谢谢。当你构造一个ICommand对象时,你同时给出了Execute和CanExecute。这是在viewmodel级别完成的,因此可以传入现有方法。当任何输入元素焦点改变时,WPF将自动调用CanExecute。好的,听起来不错,但是如何正确实现IDataErrorInfo以返回验证结果呢?我检查了很多IDataErrorInfo示例,几乎所有示例都将一些验证函数放入了公共字符串this[string propertyName]{validation functions here}。但我不想这样,因为我已经用绑定将验证函数绑定到xaml元素,并且我不想调用同一个函数两次。谢谢。如果我调用MessageBox.Show(this.Error);在我的代码中,它什么也不显示,甚至消息框也不显示。
private bool SaveUserCanExecute(string parameter)
{
    if (View.registerFormValid == true)
    {
        return true;
    }
    return false;
}
<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>