1、PasswordBox 自带的 Password 属性,不是依赖属性,无法实现属性绑定。
2、现要给 PassworBox 添加一个附加属性 PasswordProperty,和一个附加属性 AttachProperty。
3、PasswordProperty 属性实现将变化后的值推送给 PasswordBox 的 Password 属性。
3、AttachProperty 属性实现将变化 PasswordBox 的 Password 属性值,推送给 PasswordProperty。
实现:
public class PasswordHelper
{
//防止附加属性值与控件属性值循环触发赋值< Password_PasswordChanged > < OnPropertyChanged >
private static bool _isUpdating = false;
//附加属性值变化后给推送给控件
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordHelper), new FrameworkPropertyMetadata(default(string), new
PropertyChangedCallback(OnPropertyChanged)));
public static string GetPassword(DependencyObject d)
{
return d.GetValue(PasswordProperty).ToString();
}
public static void SetPassword(DependencyObject d, object value)
{
d.SetValue(PasswordProperty, value);
}
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PasswordBox password = d as PasswordBox;
password.PasswordChanged -= Password_PasswordChanged;
if (_isUpdating)
password.Password = e.NewValue?.ToString();
password.PasswordChanged += Password_PasswordChanged;
}
public static readonly DependencyProperty AttachProperty =
DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordHelper), new FrameworkPropertyMetadata(default(bool), new
PropertyChangedCallback(OnAttached)));
public static bool GetAttach(DependencyObject d)
{
return (bool)d.GetValue(AttachProperty);
}
public static void SetAttach(DependencyObject d, object value)
{
d.SetValue(AttachProperty, value);
}
//控件的值变化后给推送给附加属性
private static void OnAttached(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PasswordBox password = d as PasswordBox;
password.PasswordChanged += Password_PasswordChanged;
}
//控件的值变化后给推送给附加属性
private static void Password_PasswordChanged(object sender, RoutedEventArgs e)
{
PasswordBox passwordBox = sender as PasswordBox;
_isUpdating = true;
SetPassword(passwordBox, passwordBox.Password);
_isUpdating = false;
}
}
使用
<PasswordBox common:PasswordHelper.Attach="True"
common:PasswordHelper.Password="{BindingLoginModel.Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>