迟到总比不回答好:)
如果您想避免在运行时将密码作为纯文本暴露在内存中,则选择使用 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"/>