当前位置: 首页 > article >正文

WPF中实现PasswordBox的双向绑定

        我们知道一个属性想要实现双向绑定,最基本的便是这个属性需要时依赖属性,但是微软工程师在设计的时候Password并不是依赖属性,那我们想要实现双向绑定该怎么去做呢?

        最常用的便是改造PasswordBox,为它增加一个扩展属性,借助扩展属性实现Password的读写功能。

        首先我们建一个PasswordBoxExtend的扩展类,输入快捷语句“propa”,然后按下“Tap”键,即可自动生成我们需要的所有函数。

         之后我们改变一些主要内容

public static string GetPwd(DependencyObject obj)
{
    return (string)obj.GetValue(PwdProperty);
}

public static void SetPwd(DependencyObject obj, string value)
{
    obj.SetValue(PwdProperty, value);
}

      
public static readonly DependencyProperty PwdProperty =
    DependencyProperty.RegisterAttached("Pwd", typeof(string), typeof(PasswordBoxExtend), new PropertyMetadata("", OnPwdChanged));

/// <summary>
/// 密码属性变化事件
/// </summary>
/// <param name="d"></param>
/// <param name="e"></param>
/// <exception cref="NotImplementedException"></exception>
private static void OnPwdChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    string newPwd = (string)e.NewValue;
    if (d is PasswordBox passwordBox && passwordBox.Password != newPwd)
    {
        passwordBox.Password = newPwd;
    }
}

        这样就实现了当我们的附加属性发现变化的时候就会修改我们Password的值,但是我们Password的值改变后并不会通知我们附加属性,所以我们还需要建立一个PasswordBoxBehaviors行为事件类,让它继承Behavior,从而实现当Password改变时通知到我们的附加属性

/// <summary>
/// PasswordBox行为
/// 当Password变化时,触发自定义属性跟着变化
/// </summary>
public class PasswordBoxBehaviors : Behavior<PasswordBox>
{
    /// <summary>
    /// 附加行为
    /// 注入事件
    /// </summary>
    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.PasswordChanged += OnPasswordChanged;
    }

    private void OnPasswordChanged(object sender, RoutedEventArgs e)
    {
        PasswordBox passwordBox = sender as PasswordBox;
        string password = PasswordBoxExtend.GetPwd(passwordBox);
        if (passwordBox!= null && password != passwordBox.Password)
        {
            PasswordBoxExtend.SetPwd(passwordBox, passwordBox.Password);
        }
    }

    /// <summary>
    /// 销毁行为
    /// 移除事件
    /// </summary>
    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.PasswordChanged -= OnPasswordChanged;
    }
}

         然后我们在ViewModel中第一密码变量

 /// <summary>
 /// 密码
 /// </summary>
 private string _Pwd;
 public string Pwd
 {
     get { return _Pwd; }
     set { _Pwd = value; }
 }

        最后在前端绑定即可 

<PasswordBox
    Margin="0,10"
    md:HintAssist.Hint="请输入密码"
    pwdExtend:PasswordBoxExtend.Pwd="{Binding Pwd, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    DockPanel.Dock="Top">
    <!--绑定行为-->
    <i:Interaction.Behaviors>
        <pwdExtend:PasswordBoxBehaviors />
    </i:Interaction.Behaviors>
</PasswordBox>


http://www.kler.cn/a/375360.html

相关文章:

  • PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索
  • 大数据新视界 -- 大数据大厂之大数据环境下的网络安全态势感知
  • 内感受性注意的电生理特征:频谱和源定位分析
  • HT8787B 可任意限幅、内置自适应升压的2x9.0W立体声音频功放
  • 讲讲 kafka 维护消费状态跟踪的方法?
  • metasploit/modules/payloads 有哪些模块,以及具体使用案例
  • 《AI从0到0.5》之提示工程
  • 【办公类-04-04】华为助手导出照片视频分类(根据图片、视频的文件名日期导入“年-月-日”文件夹中,并转移到“年-月”文件中整理、转移到“年”文件夹中整理)
  • 云计算的优势及未来发展趋势
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(5)
  • 《高频电子线路》 —— 反馈型振荡器
  • BERT的中文问答系统27
  • Ceisum无人机巡检视频投放
  • AIGC生成式人工智能——泼天的富贵(三)
  • QT 加载库 找不到指定的模块
  • 软件测试学习笔记丨Selenium复用已打开浏览器
  • UI设计公司—兰亭妙微—提供优秀的医疗行业UI设计
  • vue-echarts使用
  • Mysql 5.7 grant 授权异常
  • 基于SpringBoot的助农商超管理系统
  • Java-重试机制怎么实现,自定义注解+AOP
  • Redis后台任务有哪些
  • Docker:存储原理
  • XtraBackup开源热备工具
  • vite5 打包项目兼容ie和低版本chrome
  • 卡尔曼滤波-应用白话