摘要:绑定(Binding) 是 WPF 核心技术之一,它是一种在应用程序 UI(用户界面)和业务逻辑(或数据模型)之间建立连接、提供数据流和交互的机制。它的核心思想是 “声明式” 编程,意味着你只需在 XAML 中定义数据和UI元素之间的关系,WPF 运行时会自动
什么是绑定
绑定(Binding) 是 WPF 核心技术之一,它是一种在应用程序 UI(用户界面)和业务逻辑(或数据模型)之间建立连接、提供数据流和交互的机制。它的核心思想是 “声明式” 编程,意味着你只需在 XAML 中定义数据和UI元素之间的关系,WPF 运行时会自动处理数据的同步更新,而无需编写大量繁琐的“赋值”代码(如 TextBox1.Text = myObject.Name;)。
TextBox Text="{Binding Message}" />为什么PasswordBox的Password不能绑定
由上图发现Password并不是依赖属性,也就是说这个属性不支持绑定,但是我们发现它的Password发生变化时候,会触发PasswordChanged,由此我们可以得出结论,我们自定义一个附加依赖属性用于接收和设置密码框内部的Password密码就好了
创建附加属性
创建IsPasswordAttached和Password两个附加属性,解决无法绑定问题
public class Input{ public static bool GetIsPasswordAttached(DependencyObject obj) { return (bool)obj.GetValue(IsPasswordAttachedProperty); } public static void SetIsPasswordAttached(DependencyObject obj, bool value) { obj.SetValue(IsPasswordAttachedProperty, value); } // Using a DependencyProperty as the backing store for IsPasswordAttached. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsPasswordAttachedProperty = DependencyProperty.RegisterAttached("IsPasswordAttached", typeof(bool), typeof(Input), new PropertyMetadata(OnIsPasswordAttachedChanged)); private static void OnIsPasswordAttachedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var password = d as PasswordBox; var isPassword = (bool)e.NewValue; if(isPassword) password.PasswordChanged += Password_PasswordChanged; else password.PasswordChanged -= Password_PasswordChanged; } private static void Password_PasswordChanged(object sender, RoutedEventArgs e) { var password = sender as PasswordBox; SetPassword(password, password.Password); } 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(Input), new PropertyMetadata(OnPasswordChanged)); private static void OnPasswordChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var password = d as PasswordBox; if(password.Password != (string)e.NewValue&& GetIsPasswordAttached(password)) { password.Password = (string)e.NewValue; } }原理
一个用于挂载在密码框上,初始化就自动创建密码更新事件,另一个用于密码绑定,当绑定的指发生变化时主动更新密码框密码。
使用附加属性
StackPanel> PasswordBox x:Name="passwordBox" local:Input.IsPasswordAttached="true" local:Input.Password="123" /> TextBlock Text="{Binding ElementName=passwordBox, Path=(local:Input.Password)}" /> StackPanel>注意
local这个指的是我们当前自定义的附加属性的命名空间在XAML简写
以上就是如何解决密码框不支持绑定的方法,如果你们还有其他更加简洁的办法也可以在评论区讨论,欢迎大家留言!
来源:opendotnet
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!