WPF控制元件:密碼框繫結MVVM

Windows窗發表於2024-04-24

以下是一種使用 MVVM 模式的方法:

  1. 首先,在 ViewModel 中新增一個屬性來儲存密碼,我們可以使用 SecureString 型別。
 // 密碼變數
 private SecureString _password;

 // 密碼屬性,用於獲取和設定密碼
 public SecureString Password
 {
     get
     {
         return _password;
     }
     set
     {
         // 如果新值與舊值不同
         if (_password != value)
         {
             // 更新密碼
             _password = value;
             // 觸發屬性更改通知,通知UI層密碼已更改
             RaisePropertyChanged(nameof(Password));
         }
     }
 }

  1. 建立一個附加屬性來處理 PasswordBox 的密碼變化,並將其繫結到 ViewModel 中的命令。
 public ICommand PasswordChangedCommand => new DelegateCommand<object>(PasswordChanged);

  private void PasswordChanged(object parameter)
  {
      var passwordBox = parameter as PasswordBox;
      if (passwordBox != null)
      {
          // 設定 ViewModel 中的密碼屬性
          Password = passwordBox.SecurePassword;
      }
  }

  1. 在 XAML 中,使用行為觸發器來觸發命令。
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<PasswordBox
    x:Name="PasswordBox"
    Height="45"
    Margin="5"
    FontSize="20"
    FontWeight="Thin">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="PasswordChanged">
            <i:InvokeCommandAction Command="{Binding PasswordChangedCommand}" CommandParameter="{Binding ElementName=PasswordBox}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</PasswordBox>
  1. 檢視密碼框的內容。
MessageBox.Show(SecureStringToString(Password));
/// <summary>
/// 將 SecureString 型別的資料轉換為普通的字串型別。
/// </summary>
/// <param name="secureString">要轉換的 SecureString 物件。</param>
/// <returns>轉換後的字串,如果轉換失敗則返回空字串。</returns>
private string SecureStringToString(SecureString secureString)
{
    // 初始化指標
    IntPtr ptr = IntPtr.Zero;
    try
    {
        // 將 SecureString 轉換為指標
        ptr = Marshal.SecureStringToGlobalAllocUnicode(secureString);

        if (ptr != IntPtr.Zero)
        {
            // 將指標中的資料複製到一個普通的字串
            return Marshal.PtrToStringUni(ptr);
        }
        else
        {
            return string.Empty;
        }
    }
    catch (Exception ex)
    {
        // 處理異常
        Console.WriteLine($"轉換 SecureString 出錯:{ex.Message}");
        return string.Empty;
    }
    finally
    {
        // 清除記憶體中的敏感資料
        if (ptr != IntPtr.Zero)
        {
            Marshal.ZeroFreeGlobalAllocUnicode(ptr);
        }
    }
}

相關文章