【问题标题】:How can I validate a PasswordBox using IDataErrorInfo without an AttachedProperty or DependencyProperty?如何在没有 AttachedProperty 或 DependencyProperty 的情况下使用 IDataErrorInfo 验证 PasswordBox?
【发布时间】:2012-12-19 14:56:08
【问题描述】:

我正在 WPF 中创建一个包含用户名、密码框和确认密码框的注册表单。

我打算在视图模型上使用IDataErrorInfo 进行验证,但由于 PasswordBox 的 Password 属性不是 DependencyProperty(出于安全原因)。

我不想使用 AttachedProperty,所​​以我能想到的唯一选择是使用后面的代码将密码值传递给 ViewModel,但我不知道如何引发这样的验证错误。

如何在没有绑定的情况下对 PasswordBox 控件进行验证?

我可以使用验证规则而不是 IDataErrorInfo(如果需要)。

【问题讨论】:

  • 为什么不想使用附加属性解决方案?这很简单,而且有效。 wpftutorial.net/PasswordBox.html
  • 但为了安全,我不想附加属性解决方案
  • 如何从代码隐藏传递值比附加属性解决方案更安全?

标签: wpf xaml c#-4.0 mvvm


【解决方案1】:

迟到总比不回答好:)

如果您想避免在运行时将密码作为纯文本暴露在内存中,那么您可以选择使用 PasswordBox.SecurePassword 属性。您可能仍希望对输入的值进行一些验证,例如检查它是否足够长(SecureString 类具有 Length 属性)。 在这种情况下,我应用 ErrorTemplate 的最简单方法是在 viewmodel 中使用一个额外的属性并将 PasswordBox 的任何其他属性绑定在它上面。一般来说,我更喜欢使用 Tag 属性,但任何废弃属性都适合。

所以,代码看起来像

视图模型:

public class MyViewModel : ViewModelBase, IDataErrorInfo
{
    // some code skipped

    private SecureString password;
    public SetPassword(SecureString pwd)
    {
        password = pwd.Copy();
        password.MakeReadOnly();
        OnPropertyChanged("PasswordExtra");
    }

    public bool PasswordExtra
    {
        get { return false; }
    }

    #region IDataErrorInfo
    // public string Error realization skipped

    public string this[string propertyName]
    {
        get
        {
            if (propertyName == "PasswordExtra")
            {
                if (password.Length < 8)
                    return "Password is too short";
            }
            return null;
        }
    }
    #endregion IDataErrorInfo
}

查看:

private void onPasswordChanged(object sender, RoutedEventArgs e)
{
    (DataContext as MyViewModel).SetPassword((sender as PasswordBox).SecurePassword);
}

XAML:

<PasswordBox
    Tag="{Binding PasswordExtra, ValidatesOnDataErrors=True}"
    PasswordChanged="onPasswordChanged"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2021-02-10
    • 2011-02-12
    • 2018-07-21
    • 1970-01-01
    相关资源
    最近更新 更多