Fork me on Github

附加属性

WPF的 PasswordBox 的 Password 属性不是依赖属性,不能绑定。为了实现这个控件的MVVM模式,可以利用附加属性实现 PasswordBox 控件的绑定使用。其主要的思想是,设计一个PasswordBoxHelper 类型,并在其中定义一个附加属性,这个属性的名称也叫 Password,将来作为 PasswordBox 控件的附加属性。

    /// <summary>
    /// PasswordBox扩展属性
    /// </summary>
    public class PasswordBoxHelper
    {
        public static string GetPwd(DependencyObject obj)
        {
            return (string)obj.GetValue(PasswordProperty);
        }

        public static void SetPwd(DependencyObject obj, string value)
        {
            obj.SetValue(PasswordProperty, value);
        }

         public static readonly DependencyProperty PasswordProperty =
            DependencyProperty.RegisterAttached(
                "Pwd",
                typeof(string),
                typeof(PasswordBoxHelper),
                new PropertyMetadata("", OnPasswordPropertyChangedCallback)
            );

        /// <summary>
        /// 自定义附加属性发生变化,改变Password属性
        /// </summary>
        /// <param name="d"></param>
        /// <param name="e"></param>
        private static void OnPasswordPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            PasswordBox passwordBox = (PasswordBox)d;
            string newPwd = (string)e.NewValue;
            if (passwordBox != null && !passwordBox.Password.Equals(newPwd))
            {
                passwordBox.PasswordChanged -= PasswordBox_PasswordChanged;
          passwordBox.Password = e.NewValue?.ToString() ?? string.Empty; passwordBox.PasswordChanged
+= PasswordBox_PasswordChanged; } } private static void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e) { if (sender is PasswordBox passwordBox) { SetPwd(passwordBox, passwordBox.Password); } } }

 

  <PasswordBox
      helper:PasswordBoxHelper.Pwd="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
      md:HintAssist.Hint="请输入密码"/>

 

posted @ 2025-05-17 21:32  昂昂呀  阅读(24)  评论(0)    收藏  举报