WPF控件:密码框绑定MVVM

wpf,mvvm · 浏览次数 : 4

小编点评

**MVVM 密码框示例** ```xaml xmlns:i="http://schemas.microsoft.com/xaml/behaviors" <i:Interaction.Triggers> <i:EventTrigger EventName="PasswordChanged"> <i:InvokeCommandAction Command="{Binding PasswordChangedCommand}\" CommandParameter="{Binding ElementName=PasswordBox}\" /> </i:EventTrigger> </i:Interaction.Triggers> ``` **ViewModel:** ```csharp public class ViewModel : INotifyPropertyChanged { private SecureString _password; public SecureString Password { get => _password; set { _password = value; RaisePropertyChanged(nameof(Password)); } } private ICommand _passwordChangedCommand; public ICommand PasswordChangedCommand { get => _passwordChangedCommand; set { _passwordChangedCommand = value; RaisePropertyChanged(nameof(PasswordChangedCommand)); } } private void PasswordChanged(object parameter) { // 处理密码变化逻辑 } } ``` **使用方法:** 1. 将 `PasswordBox` 添加到 XAML 页面中。 2. 在 `PasswordBox` 中设置密码。 3. 在页面加载完成后,执行 `PasswordChanged` 方法。 4. 应用程序将向 UI 发送 `PasswordChanged` 事件,并在此事件中处理密码变化。 **注意:** * `SecureString` 是 C# 中的一种安全字符串类型,它自动处理密码的敏感字符。 * `ICommand` 接口定义了一个 `Execute` 方法,该方法用于执行命令。 * `PasswordChangedCommand` 是一个命令,它用于响应密码框中的 `PasswordChanged` 事件。

正文

以下是一种使用 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);
        }
    }
}

 

 

 

与WPF控件:密码框绑定MVVM相似的内容:

WPF控件:密码框绑定MVVM

以下是一种使用 MVVM 模式的方法: 首先,在 ViewModel 中添加一个属性来保存密码,我们可以使用 SecureString 类型。 // 密码变量 private SecureString _password; // 密码属性,用于获取和设置密码 public SecureString

【.NET深呼吸】用代码写WPF控件模板

这一次咱们来探究一下怎么用纯代码写 WPF 模板。模板有个共同基类 FrameworkTemplate,数据模板、控件模板等是从此类派生的,因此,该类已定义了一些通用成员。 用代码构建模板,重要的成员是 VisualTree 属性,它的类型是 FrameworkElementFactory。可见,模

wpfui:一个开源免费具有现代化设计趋势的WPF控件库

wpfui介绍 wpfui是一款开源免费(MIT协议)具有现代化设计趋势的WPF界面库。wpfui为wpf的界面开发提供了流畅的体验,提供了一个简单的方法,让使用WPF编写的应用程序跟上现代设计趋势。截止写这篇文章,该项目获得了6.7k starts。 最近我也在使用wpfui,整体使用下来感觉非常

一款开源、免费、现代化风格的WPF UI控件库 - ModernWpf

前言 今天大姚给大家分享一款开源(MIT License)、免费、现代化风格的WPF UI控件库:ModernWpf。 项目介绍 ModernWpf是一个开源项目,它为 WPF 提供了一组现代化的控件和主题,使开发人员能够创建具有现代外观的桌面应用程序。 项目特点 可以轻松自定义的浅色和深色主题。

基于Material Design风格开源、易用、强大的WPF UI控件库

前言 今天大姚给大家分享一款基于Material Design风格开源、免费(MIT License)、易于使用、强大的WPF UI控件库:MaterialDesignInXamlToolkit。 项目介绍 MaterialDesignInXamlToolkit 是一个开源、易于使用、强大的 WPF

WPF中非递归(无后台代码)动态实现TreeView

WPF中提供了TreeView控件,对于TreeView控件的基本使用已经有很多文章。大都是介绍如何在后台代码递归遍历数据源,动态创建TreeView。这里我想介绍一下如何只通过XAML标记,不用一行后台代码遍历数据实现TreeView。

【WPF】根据选项值显示不同的编辑控件(使用DataTemplateSelector)

接了一个小杂毛项目,大概情形是这样的:ZWT先生开的店是卖拆片机的,Z先生不仅卖机器,还贴心地提供一项服务:可以根据顾客需要修改两个电机的转向和转速(机器厂家有给SDK的,但Z自己不会写程序)。厂家有配套一个调节器,调整参数时连接到拆片机的串口上,然后旋转按钮可以调速,拨码开关可以设定电机正转还是反

WPF/C#:实现导航功能

前言 在WPF中使用导航功能可以使用Frame控件,这是比较基础的一种方法。前几天分享了wpfui中NavigationView的基本用法,但是如果真正在项目中使用起来,基础的用法是无法满足的。今天通过wpfui中的mvvm例子来说明在wpfui中如何通过依赖注入与MVVM模式使用导航功能。实践起来

循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(6) -- 窗口控件脏数据状态IsDirty的跟踪处理

在我们窗口新增、编辑状态下的时候,我们往往会根据是否修改过的痕迹-也就是脏数据状态进行跟踪,如果用户发生了数据修改,我们在用户退出窗口的时候,提供用户是否丢弃修改还是继续编辑,这样在一些重要录入时的时候,可以避免用户不小心关掉窗口,导致窗口的数据要重新录入的尴尬场景。本篇随笔介绍基于WPF开发中,窗...

WPF随笔收录-DataGrid固定右侧列

一、前言 在项目开发过程中,DataGrid是经常使用到的一个数据展示控件,而通常表格的最后一列是作为操作列存在,比如会有编辑、删除等功能按钮。但WPF的原始DataGrid中,默认只支持固定左侧列,这跟大家习惯性操作列放最后不符,今天就来介绍一种简单的方式实现固定右侧列。(这里的实现方式参考的大佬