1,前几天学习一个项目的时候,遇到了PasswordBox这个控件,由于这个控件的Password属性,不是依赖属性,所以不能和ViewModel层进行数据绑定。

 2,但是要实现前后端彻底的分离,就需要绑定,那么下面我的本文的主角“附加属性”就要出场了。

 3,附加属性的概念,就是类(控件类)本身没有这个属性,我们给它一个我们定义的属性。那是怎么给的呢?

 4,怎么给的,刚开始我也很迷惑,其实就是在xmal文件中,在控件属性中,直接写上我们定义的附加属性就好(放心,编辑器是不会报错的)。

 5,附加属性,是一个属性,属性必须依附于类,也就是我们要来定义一个类,来容纳我们的附加属性。

    由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。-LMLPHP

 要定义一个附加属性,需要这么多的代码,别担心,这些代码不需要您手动敲出来,在vs的类中,找一个合适的地方,输入“propa”,然后根据编辑器的提示,按两次Tab键,

编辑器会自动帮助您完成这些代码。然后再次按Tab键,编辑器会引导您做“完形填空”(不会完型填空的朋友,您可以查下资料,本文不再赘述),直到您按下Enter键,这个附加属性就创建完成了。

(此处的CallBack方法,是我自己定义的,不是自动生成的。什么?你说我为什么知道CallBack的参数是DependencyObject和DependencyPropertyChangedEventArgs,为什么知道CallBack可以放到

PropertyMetadata的构造函数中,因为我查从源数据了啊 ^-^  ^-^,查看下PropertyMetadata的定义就知道了(使用方法后面讲)。

注意,注意,注意(重要的话说三遍,否则你的下一步将无法进行!!!)

上面定义的类,它的文件位置在这里:

由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。-LMLPHP

 7,附加属性定义好了,怎么来使用它呢?也是一个问题,我到现在还是没有完全扭转过来这个思维,惭愧!!!下面讲一下怎么来使用它:

由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。-LMLPHP

    在窗体中,定义一个Rectangle,在Rectangle的属性中,写上我们定义的附加属性,大胆写,尽管写,不会出错的。

    因为我们定义的类,存在于名称空间WpfTest中,而WpfTest在xaml映射在local,因此我们的附加属性Height存在于local:AttachProperty.Height,

    第一次使用这个附加属性的时候,编辑器会报错,提示“命名空间clr-namespace:WpfTest中不存在AttachProperty名称”,

由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。-LMLPHP

    如果确定文件位置是对的,先不用管这句话,运行之后,就不会再报错了,为什么会这样,请路过的大神,帮忙指点一二,非常感激。

  

    8,来到主窗体的构造函数内,写下这句话:

由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。-LMLPHP   

    然后启动窗体,可以看到,窗体内矩形的高,由xaml中设置的50变成了我们在构造器中设置的100,那么就是说这个附加属性对于描绘矩形起效了(注意再xaml中是双向绑定)。

9,附加属性的获取:在主窗体的构造函数中,写下这样的代码:

由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。-LMLPHP

然后启动,就可以看到MessageBox中,会显示您在xmal中这是的rectangle的高的值,为50. 

后记:1,在第五步中,我们定义了一个附加属性,并且定义了一个CallBack委托,当值发生变化的时候,我们在委托方法中,就可以去到附加属性的值,可以在这里编写我们的业务逻辑。

           2,全篇文章看下来,和PassowrdBox完全没有关系对吧?因为它不是本文的重点,下面简述一下。

           3,PasswordBox的Password属性,不是依赖属性,那么我们就给他一个附加属性,在CallBack中,获取到PasswordBox的实例,指定PasswordBox的PasswordChanged事件处理程序,

                在事件处理程序中,可以对model进行绑定,注意,在为PasswordBox创建附加属性时,要指定一个string类型的默认值,用于触发PasswordChanged事件处理程序的执行。

          4,附加属性的设置,对于控件来说,不会起任何视觉上的效果,我们还必须要在viewModel层,对拿到的附加属性值进行处理,来使控件的视觉效果发生变化。

06-18 20:32