如何隐藏密码框 wpf 的验证错误?
How hide the validation error first moment for passwordbox wpf?
我尝试在我的WPF页面中实现密码框数据校验。
我在我的项目中使用 MVVM Light。
1) 我有 ViewModel,我通过数据注释
实现了 IDataErrorInfo
[Required(ErrorMessage = "Email field should be filled in")]
[RegularExpression(@"(^(?=.*[A-Z])(?=.*\d)(.{8,100})$)", ErrorMessage = ("Password must have minimum 8 characters, at least one number and one capitalized letter"))]
public string Password
{
get => _password;
set => Set(ref _password, value);
}
和接口实现
#region Validation configure
public string Error => throw new NotImplementedException();
public string this[string columnName]
{
get
{
string error = String.Empty;
switch (columnName)
{
case "Password":
string passwordError = ValidateModelProperty(Password, columnName);
return passwordError;
}
return error;
}
}
private string ValidateModelProperty(object value, string propertyName)
{
ICollection<ValidationResult> validationResults = new List<ValidationResult>();
ValidationContext validationContext = new ValidationContext(this, null, null) { MemberName = propertyName };
if (!Validator.TryValidateProperty(value, validationContext, validationResults))
foreach (ValidationResult validationResult in validationResults)
return validationResult.ErrorMessage;
return null;
}
#endregion
2)我在后台代码中发送了密码值
protected SignInViewModel Context => DataContext as SignInViewModel;
private void Password_PasswordChanged(object sender, RoutedEventArgs e)
{
Context.Password = password.Password;
}
在 ViewModelLocator
中通过 ServiceLocator 实现上下文的 MVVM light 实现
public SignInViewModel SignInContext => ServiceLocator.Current.GetInstance<SignInViewModel>();
很好,我在 ViewModel 中获取了密码数据
3) XAML
<PasswordBox x:Name="password"
PasswordChanged="Password_PasswordChanged"
materialDesign:HintAssist.Hint="Password"
Margin="0,0,0,20"
Style="{StaticResource MaterialDesignFloatingHintPasswordBox}"
FontSize="18"
Foreground="RoyalBlue"
FontWeight="Heavy">
<PasswordBox.Tag>
<Binding Mode="OneWay" Path="Password" >
<Binding.ValidationRules>
<DataErrorValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</PasswordBox.Tag>
</PasswordBox>
这里我尝试绑定Tag
来显示PasswordBox
下的错误信息。
但是如果参数是ValidatesOnTargetUpdated="True"
。我遇到了错误消息的问题,它显示了页面第一次打开的时间。但是,验证有效! (当我在密码框中输入值时应该会显示)
如果我选择 ValidatesOnTargetUpdated="False"
,则验证无效。数据发送到 VM 但我在密码框中输入值时没有错误消息。
我想在页面打开时实现逻辑我写数据时表格清晰我可以看到密码框下的验证错误。如何修复那一刻?
First load of validation Rule
您可以在第一次加载时简单地添加一个标志。
像这样
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var validResult = new ValidationResult(true, string.Empty);
if (IsFirstLoad)
{
IsFirstLoad = false;
return validResult;
}
}
我尝试在我的WPF页面中实现密码框数据校验。 我在我的项目中使用 MVVM Light。
1) 我有 ViewModel,我通过数据注释
实现了IDataErrorInfo
[Required(ErrorMessage = "Email field should be filled in")]
[RegularExpression(@"(^(?=.*[A-Z])(?=.*\d)(.{8,100})$)", ErrorMessage = ("Password must have minimum 8 characters, at least one number and one capitalized letter"))]
public string Password
{
get => _password;
set => Set(ref _password, value);
}
和接口实现
#region Validation configure
public string Error => throw new NotImplementedException();
public string this[string columnName]
{
get
{
string error = String.Empty;
switch (columnName)
{
case "Password":
string passwordError = ValidateModelProperty(Password, columnName);
return passwordError;
}
return error;
}
}
private string ValidateModelProperty(object value, string propertyName)
{
ICollection<ValidationResult> validationResults = new List<ValidationResult>();
ValidationContext validationContext = new ValidationContext(this, null, null) { MemberName = propertyName };
if (!Validator.TryValidateProperty(value, validationContext, validationResults))
foreach (ValidationResult validationResult in validationResults)
return validationResult.ErrorMessage;
return null;
}
#endregion
2)我在后台代码中发送了密码值
protected SignInViewModel Context => DataContext as SignInViewModel;
private void Password_PasswordChanged(object sender, RoutedEventArgs e)
{
Context.Password = password.Password;
}
在 ViewModelLocator
public SignInViewModel SignInContext => ServiceLocator.Current.GetInstance<SignInViewModel>();
很好,我在 ViewModel 中获取了密码数据
3) XAML
<PasswordBox x:Name="password"
PasswordChanged="Password_PasswordChanged"
materialDesign:HintAssist.Hint="Password"
Margin="0,0,0,20"
Style="{StaticResource MaterialDesignFloatingHintPasswordBox}"
FontSize="18"
Foreground="RoyalBlue"
FontWeight="Heavy">
<PasswordBox.Tag>
<Binding Mode="OneWay" Path="Password" >
<Binding.ValidationRules>
<DataErrorValidationRule ValidatesOnTargetUpdated="True"/>
</Binding.ValidationRules>
</Binding>
</PasswordBox.Tag>
</PasswordBox>
这里我尝试绑定Tag
来显示PasswordBox
下的错误信息。
但是如果参数是ValidatesOnTargetUpdated="True"
。我遇到了错误消息的问题,它显示了页面第一次打开的时间。但是,验证有效! (当我在密码框中输入值时应该会显示)
如果我选择 ValidatesOnTargetUpdated="False"
,则验证无效。数据发送到 VM 但我在密码框中输入值时没有错误消息。
我想在页面打开时实现逻辑我写数据时表格清晰我可以看到密码框下的验证错误。如何修复那一刻?
First load of validation Rule
您可以在第一次加载时简单地添加一个标志。 像这样
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
var validResult = new ValidationResult(true, string.Empty);
if (IsFirstLoad)
{
IsFirstLoad = false;
return validResult;
}
}