WPF控件:密码框绑定MVVM

发布于:2024-05-01 ⋅ 阅读:(169) ⋅ 点赞:(0)

以下是一种使用 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">
    
 "PasswordChanged">
 "{Binding PasswordChangedCommand}" CommandParameter="{Binding ElementName=PasswordBox}" />
 
 

  1. 查看密码框的内容。
MessageBox.Show(SecureStringToString(Password));
/// 
/// 将 SecureString 类型的数据转换为普通的字符串类型。
/// 
/// 要转换的 SecureString 对象。
/// 转换后的字符串,如果转换失败则返回空字符串。
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);
 }
 }
}


网站公告

今日签到

点亮在社区的每一天
去签到