WPF中PasswordBox控件无法绑定Password属性解决办法

在WPF中,默认的Password控件的Password属性是不允许为之绑定的,下面是一个解决绑定Password的方法的代码:

1.前台代码

<Window x:Class="PasswordBoxDemo.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="MainWindow" Height="142" Width="256"

        xmlns:Helper="clr-namespace:PasswordBoxDemo"

        WindowStartupLocation="CenterScreen">

    <Grid>

        <ListView x:Name="lvUsers"

                  HorizontalAlignment="Stretch"

                  VerticalAlignment="Stretch"

                  >

            <ListView.View >

                <GridView x:Name="GridView">

                    <GridView.Columns>

                        <GridViewColumn Header="用户名" >

                            <GridViewColumn.CellTemplate>

                                <DataTemplate  >

                                    <TextBox 

                                             HorizontalAlignment="Stretch"

                                             VerticalAlignment="Stretch"

                                             Text="{Binding Path=UserName}"

                                             ToolTip="{Binding Path=UserName}"

                                             Width="100"

                                             Height="20"></TextBox>

                                </DataTemplate>

                            </GridViewColumn.CellTemplate>

                        </GridViewColumn>

                        <GridViewColumn Header="密码" >

                            <GridViewColumn.CellTemplate>

                                <DataTemplate  >

                                    <PasswordBox 

                                                 HorizontalAlignment="Stretch"

                                                 VerticalAlignment="Stretch"

                                                 Width="100"

                                                 Height="20"

                                                 PasswordChar="*"

                                                 MaxLength="20"

                                                 Helper:PasswordBoxHelper.Attach="True"

                                                 Helper:PasswordBoxHelper.Password="{Binding Path=Pwd,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />

                                </DataTemplate>

                            </GridViewColumn.CellTemplate>

                        </GridViewColumn>

                    </GridView.Columns>

                </GridView>

            </ListView.View>

        </ListView>



    </Grid>

</Window>

2.后台代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.Collections.ObjectModel;



namespace PasswordBoxDemo

{

    /// <summary>

    /// MainWindow.xaml 的交互逻辑

    /// </summary>

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);

        }



        void MainWindow_Loaded(object sender, RoutedEventArgs e)

        {

            ObservableCollection<User> users = new ObservableCollection<User>();



            User p = new User();

            p.UserName = "张三";

            p.Pwd = "zhangsan";



            User p2 = new User();

            p2.UserName = "李四";

            p2.Pwd = "lisi";



            users.Add(p);

            users.Add(p2);



            this.lvUsers.ItemsSource = users;

            

        }

    }



    public class User

    {

        private string _userName;

        private string _password;

        public string UserName

        {

            set { _userName = value; }

            get { return _userName; }

        }



        public string Pwd

        {

            set { _password = value; }

            get { return _password; }

        }

    }

}

3. 为PasswordBox控件的Password增加绑定功能 的PasswordBoxHelpe.csr文件

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;



namespace PasswordBoxDemo

{

    /// <summary>  

    /// 为PasswordBox控件的Password增加绑定功能  

    /// </summary>  

    public static class PasswordBoxHelper

    {

        public static readonly DependencyProperty PasswordProperty =

            DependencyProperty.RegisterAttached("Password",

            typeof(string), typeof(PasswordBoxHelper),

            new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));

        public static readonly DependencyProperty AttachProperty =

            DependencyProperty.RegisterAttached("Attach",

            typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach));

        private static readonly DependencyProperty IsUpdatingProperty =

           DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),

           typeof(PasswordBoxHelper));



        public static void SetAttach(DependencyObject dp, bool value)

        {

            dp.SetValue(AttachProperty, value);

        }

        public static bool GetAttach(DependencyObject dp)

        {

            return (bool)dp.GetValue(AttachProperty);

        }

        public static string GetPassword(DependencyObject dp)

        {

            return (string)dp.GetValue(PasswordProperty);

        }

        public static void SetPassword(DependencyObject dp, string value)

        {

            dp.SetValue(PasswordProperty, value);

        }

        private static bool GetIsUpdating(DependencyObject dp)

        {

            return (bool)dp.GetValue(IsUpdatingProperty);

        }

        private static void SetIsUpdating(DependencyObject dp, bool value)

        {

            dp.SetValue(IsUpdatingProperty, value);

        }

        private static void OnPasswordPropertyChanged(DependencyObject sender,

            DependencyPropertyChangedEventArgs e)

        {

            PasswordBox passwordBox = sender as PasswordBox;

            passwordBox.PasswordChanged -= PasswordChanged;

            if (!(bool)GetIsUpdating(passwordBox))

            {

                passwordBox.Password = (string)e.NewValue;

            }

            passwordBox.PasswordChanged += PasswordChanged;

        }

        private static void Attach(DependencyObject sender,

            DependencyPropertyChangedEventArgs e)

        {

            PasswordBox passwordBox = sender as PasswordBox;

            if (passwordBox == null)

                return;

            if ((bool)e.OldValue)

            {

                passwordBox.PasswordChanged -= PasswordChanged;

            }

            if ((bool)e.NewValue)

            {

                passwordBox.PasswordChanged += PasswordChanged;

            }

        }

        private static void PasswordChanged(object sender, RoutedEventArgs e)

        {

            PasswordBox passwordBox = sender as PasswordBox;

            SetIsUpdating(passwordBox, true);

            SetPassword(passwordBox, passwordBox.Password);

            SetIsUpdating(passwordBox, false);

        }

    }

}

  

你可能感兴趣的:(password)