2012-12-19 38 views
3

我正在創建一個註冊表單,其中包含用戶名,密碼框,&在WPF中確認密碼框。如何在不使用AttachedProperty或DependencyProperty的情況下使用IDataErrorInfo驗證PasswordBox?

我打算在視圖模型上使用IDataErrorInfo進行驗證,但由於PasswordBox的Password屬性不是DependencyProperty屬性(由於安全原因)。

我不想使用AttachedProperty,所​​以我能想到的唯一選擇是使用後面的代碼將密碼值傳遞給ViewModel,但我不知道如何引發這樣的驗證錯誤。

如何在沒有綁定的情況下提升PasswordBox控件的驗證?

我可以使用驗證規則而不是IDataErrorInfo(如果需要)。

+1

爲什麼你不希望使用附加屬性解?這很簡單,而且很有效。 http://www.wpftutorial.net/PasswordBox.html –

+0

但爲了安全起見,我不想附加屬性解決方案 – user1916083

+0

如何從代碼隱藏中傳遞值比附加屬性解決方案更安全? –

回答

4

這是更好地回答晚做總比不:)

如果你想避免暴露密碼以純文本在內存中運行時,那你就選擇使用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"/> 
+0

你節省了我的一天。謝謝! – bravohex

相關問題