【问题标题】:How hide the validation error first moment for passwordbox wpf?如何隐藏密码框 wpf 的验证错误?
【发布时间】: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


    【解决方案1】:

    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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多