一、目的:本身自带的PassWord不支持绑定
二、Xaml部分
<UserControl x:Class="HeBianGu.General.WpfControlLib.BindPassWordBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:HeBianGu.General.WpfControlLib"
mc:Ignorable="d"
d:DesignHeight="50" d:DesignWidth="300">
<Grid>
<PasswordBox x:Name="pb_center" PasswordChanged="pb_center_PasswordChanged" />
</Grid>
</UserControl>
三、代码部分
/// <summary> 可以绑定的密码框 </summary>
public partial class BindPassWordBox : UserControl
{
PasswordBox _password = null;
private void pb_center_PasswordChanged(object sender, RoutedEventArgs e)
{
this.PassWord = this._password.Password;
}
public BindPassWordBox()
{
InitializeComponent();
}
public string PassWord
{
get { return (string)GetValue(PassWordProperty); }
set { SetValue(PassWordProperty, value); }
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PassWordProperty =
DependencyProperty.Register("PassWord", typeof(string), typeof(BindPassWordBox), new PropertyMetadata(default(string), (d, e) =>
{
BindPassWordBox control = d as BindPassWordBox;
if (control == null) return;
string config = e.NewValue as string;
if (control._password == null) return;
control._password.Password = config;
SetPasswordBoxSelection(control._password, config.Length, 0);
}));
private static void SetPasswordBoxSelection(PasswordBox passwordBox, int start, int length)
{
var select = passwordBox.GetType().GetMethod("Select",
BindingFlags.Instance | BindingFlags.NonPublic);
select.Invoke(passwordBox, new object[] { start, length });
}
}
四、原理
封装一层PassWordBox控件,自定义依赖属性,在PassWordBox的Changed事件中赋值依赖属性
SetPasswordBoxSelection(control._password, config.Length, 0);
此方法用来设置光标,否则输入后光标位置不正确