欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

依赖属性

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

依赖属性