当前位置: 移动技术网 > IT编程>开发语言>.net > 依赖属性

依赖属性

2019年11月24日  | 移动技术网IT编程  | 我要评论

影讯,流感致69人死亡,喝绿茶的好处和坏处

  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键可以快速生成注册依赖属性的代码。生成的代码如下图:

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网