這是更好地回答晚做總比不:)
如果你想避免暴露密碼以純文本在內存中運行時,那你就選擇使用PasswordBox.SecurePassword財產。你可能還想對輸入值進行一些驗證,例如檢查它是否足夠長(SecureString類具有Length屬性)。 在這種情況下,我應用ErrorTemplate的最簡單方法是在viewmodel中使用額外的屬性,並在其上綁定PasswordBox的任何其他屬性。通常我更喜歡使用標籤屬性,但任何廢物屬性都適合。
所以,代碼看起來像
視圖模型:
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"/>
爲什麼你不希望使用附加屬性解?這很簡單,而且很有效。 http://www.wpftutorial.net/PasswordBox.html –
但爲了安全起見,我不想附加屬性解決方案 – user1916083
如何從代碼隱藏中傳遞值比附加屬性解決方案更安全? –