【发布时间】:2019-08-06 08:31:57
【问题描述】:
我尝试在我的 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;
}
在ViewModelLocatorViewModelLocator中ServiceLocator实现的上下文的MVVM轻实现
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,但我在密码框中写入值时没有错误消息。
我想实现页面打开时的逻辑我写数据时表单清晰我可以在密码框下看到验证错误。如何修复那个时刻?
【问题讨论】:
标签: c# wpf mvvm mvvm-light