背景:TextBox可以很轻松地对Text使用Binding,绑定ViewModel类里面的属性
即:
但是使用PasswordBox的密码框就不行了,因为没有Text这个属性,Password不是依赖属性
那么就要自己实现一个PasswordBox的帮助类了
第一步添加Helper类(创建在WPF用户控件库中)
- public class PasswordBindingHelper
- {
- public static readonly DependencyProperty PasswordProperty =
- DependencyProperty.RegisterAttached("Password",
- typeof(string), typeof(PasswordBindingHelper),
- new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));
-
- public static readonly DependencyProperty AttachProperty =
- DependencyProperty.RegisterAttached("Attach",
- typeof(bool), typeof(PasswordBindingHelper), new PropertyMetadata(false, Attach));
-
- private static readonly DependencyProperty IsUpdatingProperty =
- DependencyProperty.RegisterAttached("IsUpdating", typeof(bool),
- typeof(PasswordBindingHelper));
-
-
- 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);
- }
- }
第二步:到xaml中使用帮助类添加PasswordBox的绑定就行了:
local:PasswordBindingHelper.Password="{Binding LoginPwd,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
这下就可以绑定VeiwModel类下面的LoginPwd了
Attach是一个附加属性(Attached Property),它被用来激活或者禁用该 PasswordBindingHelper 的功能。
参考:mvvmlight下passwordBox绑定的解决方法_azyrg88422的博客-CSDN博客
好像上面的写复杂了,其实就是简单的附加属性就行
帮助类中设置附加属性,附加属性没有指定是在哪个控件,想要在哪个地方用都行
- public class APPwd
- {
- 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(APPwd), new PropertyMetadata(null, new PropertyChangedCallback((s, e) =>
- {
- var pwd = s as PasswordBox;
- pwd.Password = e.NewValue.ToString();
- })));
- }
用上附加属性的PasswordBox就可以用这个附加属性绑定ViewModel的内容了
<PasswordBox local:APPwd.Password="{Binding Password}"/>