翼度科技»论坛 编程开发 .net 查看内容

WPF控件:密码框绑定MVVM

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
以下是一种使用 MVVM 模式的方法:

  • 首先,在 ViewModel 中添加一个属性来保存密码,我们可以使用 SecureString 类型。
  1. // 密码变量
  2. private SecureString _password;
  3. // 密码属性,用于获取和设置密码
  4. public SecureString Password
  5. {
  6.      get
  7.      {
  8.          return _password;
  9.      }
  10.      set
  11.      {
  12.          // 如果新值与旧值不同
  13.          if (_password != value)
  14.          {
  15.              // 更新密码
  16.              _password = value;
  17.              // 触发属性更改通知,通知UI层密码已更改
  18.              RaisePropertyChanged(nameof(Password));
  19.          }
  20.      }
  21. }
复制代码
 

  • 创建一个附加属性来处理 PasswordBox 的密码变化,并将其绑定到 ViewModel 中的命令。
  1. public ICommand PasswordChangedCommand => new DelegateCommand<object>(PasswordChanged);
  2.   private void PasswordChanged(object parameter)
  3.   {
  4.       var passwordBox = parameter as PasswordBox;
  5.       if (passwordBox != null)
  6.       {
  7.           // 设置 ViewModel 中的密码属性
  8.           Password = passwordBox.SecurePassword;
  9.       }
  10.   }
复制代码
 

  • 在 XAML 中,使用行为触发器来触发命令。
  1. xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
复制代码
  1. <PasswordBox
  2.     x:Name="PasswordBox"
  3.     Height="45"
  4.     Margin="5"
  5.     FontSize="20"
  6.     FontWeight="Thin">
  7.     <i:Interaction.Triggers>
  8.         <i:EventTrigger EventName="PasswordChanged">
  9.             <i:InvokeCommandAction Command="{Binding PasswordChangedCommand}" CommandParameter="{Binding ElementName=PasswordBox}" />
  10.         </i:EventTrigger>
  11.     </i:Interaction.Triggers>
  12. </PasswordBox>
复制代码

  • 查看密码框的内容。
  1. MessageBox.Show(SecureStringToString(Password));
复制代码
  1. /// <summary>
  2. /// 将 SecureString 类型的数据转换为普通的字符串类型。
  3. /// </summary>
  4. /// <param name="secureString">要转换的 SecureString 对象。</param>
  5. /// <returns>转换后的字符串,如果转换失败则返回空字符串。</returns>
  6. private string SecureStringToString(SecureString secureString)
  7. {
  8.     // 初始化指针
  9.     IntPtr ptr = IntPtr.Zero;
  10.     try
  11.     {
  12.         // 将 SecureString 转换为指针
  13.         ptr = Marshal.SecureStringToGlobalAllocUnicode(secureString);
  14.         if (ptr != IntPtr.Zero)
  15.         {
  16.             // 将指针中的数据复制到一个普通的字符串
  17.             return Marshal.PtrToStringUni(ptr);
  18.         }
  19.         else
  20.         {
  21.             return string.Empty;
  22.         }
  23.     }
  24.     catch (Exception ex)
  25.     {
  26.         // 处理异常
  27.         Console.WriteLine($"转换 SecureString 出错:{ex.Message}");
  28.         return string.Empty;
  29.     }
  30.     finally
  31.     {
  32.         // 清除内存中的敏感数据
  33.         if (ptr != IntPtr.Zero)
  34.         {
  35.             Marshal.ZeroFreeGlobalAllocUnicode(ptr);
  36.         }
  37.     }
  38. }
复制代码
 
 
 

来源:https://www.cnblogs.com/CDRPS/p/18156533
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具