依赖属性
程序员文章站
2023-10-28 23:34:10
Windows Presentation Foundation(WPF)提供了一组服务,这些服务可用于扩展公共语言运行时(CLR)属性的功能,这些服务通常统称为WPF属性系统。由WPF属性系统支持的属性称为依赖项属性(Dependency Property)。 基本上依赖属性都支持绑定(Bindin ......
windows presentation foundation(wpf)提供了一组服务,这些服务可用于扩展公共语言运行时(clr)属性的功能,这些服务通常统称为wpf属性系统。由wpf属性系统支持的属性称为依赖项属性(dependency property)。
基本上依赖属性都支持绑定(binding),但也并不是说,非依赖属性就不能使用绑定。例如我们常用的密码框(passwordbox)为了保证安全性,它的password属性就不是依赖属性(即不能以binding的方式实现数据通知),但是我们可以通过附加属性、行为的方式实现绑定。
首先,我们创建一个名为passwordboxhelper的类,为password注册附加属性。
1 public class passwordboxhelper 2 { 3 public static string getpassword(dependencyobject obj) 4 { 5 return (string)obj.getvalue(passwordproperty); 6 } 7 8 public static void setpassword(dependencyobject obj, string value) 9 { 10 obj.setvalue(passwordproperty, value); 11 } 12 13 // using a dependencyproperty as the backing store for password. this enables animation, styling, binding, etc... 14 public static readonly dependencyproperty passwordproperty = 15 dependencyproperty.registerattached("password", typeof(string), typeof(passwordboxhelper), new frameworkpropertymetadata(string.empty, onpasswordpropertychanged)); 16 17 private static void onpasswordpropertychanged(dependencyobject d, dependencypropertychangedeventargs e) 18 { 19 passwordbox passwordbox = d as passwordbox; 20 string password = (string)e.newvalue; 21 22 if (passwordbox != null && !string.equals(passwordbox.password, password)) 23 { 24 passwordbox.password = password; 25 } 26 } 27 }
然后,在创建一个名为passwordboxbehavior的类,继承自behavior,为passwordbox附加行为。
1 public class passwordboxbehavior : behavior<passwordbox> 2 { 3 protected override void onattached() 4 { 5 base.onattached(); 6 associatedobject.passwordchanged += associatedobject_passwordchanged; 7 } 8 9 protected override void ondetaching() 10 { 11 base.ondetaching(); 12 associatedobject.passwordchanged -= associatedobject_passwordchanged; 13 } 14 15 private void associatedobject_passwordchanged(object sender, routedeventargs e) 16 { 17 passwordbox passwordbox = sender as passwordbox; 18 19 string password = passwordboxhelper.getpassword(passwordbox); 20 21 if (passwordbox != null && passwordbox.password != password) 22 { 23 passwordboxhelper.setpassword(passwordbox, passwordbox.password); 24 } 25 } 26 }
最后,在界面上为我们在passwordboxhelper类中注册的password设置属性绑定,同时为passwordbox设置behavior。
1 <passwordbox x:name="txtpwd" width="180" verticalcontentalignment="center" background="transparent" maxlength="8"
helper:passwordboxhelper.password="{binding path=password, mode=twoway, updatesourcetrigger=propertychanged}"> 2 <i:interaction.behaviors> 3 <helper:passwordboxbehavior /> 4 </i:interaction.behaviors> 5 </passwordbox>
以上就完成了密码框的属性绑定。
tips:
在“工具-选项-常规-键盘”中选择visual c# 2005。
在代码中输入“propa”,再按tab键可以快速生成注册附加属性的代码。生成的代码如下图:
在代码中输入“propdp”,再按tab键可以快速生成注册依赖属性的代码。生成的代码如下图:
上一篇: 姜发芽了还能吃吗,答案就在这里
下一篇: 什么果汁减肥效果好呢,又有什么其他好处