WPF PasswordBox 绑定

本文介绍了一种解决WPF中PasswordBox不能直接进行数据绑定的方法,通过创建扩展类和行为来实现双向数据绑定,并提供了具体的代码示例。在绑定时需注意设置`Mode=TwoWay,UpdateSourceTrigger=PropertyChanged`以确保数据同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于PasswordBox,可能很多人都会按着TextBox的路子,在ViewModel里面写一个属性,然后绑定到Password属性上。当你写完这一切的时候,你会突然收到Visual Studio的提示:Password并不是依赖属性,不能绑定.

要先增加一个扩展方类

namespace MacSnManage.Extensions
{
    public class PassWordExtensions
    {


        public static string GetPassWord(DependencyObject obj)
        {
            return (string)obj.GetValue(PassWordProperty);
        }

        public static void SetPassWord(DependencyObject obj, string value)
        {
            obj.SetValue(PassWordProperty, value);
        }

        // Using a DependencyProperty as the backing store for Password.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty PassWordProperty =
            DependencyProperty.RegisterAttached("PassWord", typeof(string), typeof(PassWordExtensions), new PropertyMetadata(string.Empty, OnPassWordPropertyChanged));

        static void OnPassWordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var passWord = sender as PasswordBox;
            string pw = (string)e.NewValue;
            if (passWord!=null  && passWord.Password != pw)
            {
                passWord.Password = pw;
            }
        }

    }
    public class PasswordBehavior : Behavior<PasswordBox>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.PasswordChanged += AssociatedObject_PasswordChanged;
        }
        /// <summary>
        /// 读内容与更新内容
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AssociatedObject_PasswordChanged(object sender, RoutedEventArgs e)
        {
            var passWord = sender as PasswordBox;
            string pw = PassWordExtensions.GetPassWord(passWord);
            if (passWord!=null  && passWord.Password != pw)
            {
                PassWordExtensions.SetPassWord(passWord, passWord.Password);
            }
        }

        protected override void OnDetaching()
        {
            base.OnDetaching(); AssociatedObject.PasswordChanged -= AssociatedObject_PasswordChanged;
        }


    }




}

声明写好的扩展类,以及behaviors

             xmlns:pass="clr-namespace:MacSnManage.Extensions"
             xmlns:i="http://schemas.microsoft.com/xaml/behaviors"

下面是绑定

            <PasswordBox Margin="0,10"
               Style="{StaticResource MaterialDesignFloatingHintPasswordBox}" 
                        DockPanel.Dock="Top"
                     pass:PassWordExtensions.PassWord="{Binding PassWord, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"    
                  VerticalAlignment="Center" Cursor="IBeam">
                <i:Interaction.Behaviors>
                    <pass:PasswordBehavior></pass:PasswordBehavior>
                </i:Interaction.Behaviors>
                <md:HintAssist.Hint>
                    <StackPanel    Orientation="Horizontal"     Margin="-1 0 0 0">
                        <md:PackIcon    Kind="LockCheck" />
                        <TextBlock    Text=" Password" />
                    </StackPanel>
                </md:HintAssist.Hint>
            </PasswordBox>

//
 pass:PassWordExtensions.PassWord="{Binding PassWord, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"   
 Mode=TwoWay, UpdateSourceTrigger=PropertyChanged这两个一定不能少

资源放在:https://download.youkuaiyun.com/download/lw8014/84398275icon-default.png?t=M276https://download.youkuaiyun.com/download/lw8014/84398275

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值