我有一个几乎没有字段的注册表。这是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>
从上面的代码中可以看出,我使用class Required来验证字段。函数Validate()类必需然后返回ValidationResult
对象。我还为输入的样式定义了一些触发器,因此我可以在视图中向用户显示验证结果。
我不知道如何检测ViewModel中所有输入的验证状态。在ViewModel中,我有SaveUserCanExecute
函数,它应该在所有输入的验证状态基础上启用/禁用注册表单提交按钮。
那么有什么简单的方法来实现这个目标吗?
我可以为此做一些解决方法,但我认为这不是正确的方法。
现在我在一个提交按钮的Click事件后面的View代码中创建了一个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;
}
但正如我之前提到的,我认为这不是正确的方法,我正在寻找一些更清晰的方法。
答案 0 :(得分:1)
在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可以简单地检查string.IsNullOrEmpty(this.Error)。
答案 1 :(得分:0)
将命令(ICommand)绑定到Submit Button并在其CanExecute方法中实现此逻辑。这是一个经典的ICommand实现。