代码改变世界

WPF依赖项属性

2012-12-12 11:41  BreakChen  阅读(4787)  评论(4编辑  收藏  举报

WPF中的依赖项属性

 

WPF的工程是由XAML文件和C#文件沟通构成的。C#在工程中主要用于处理逻辑,而XAML则用来在软件界面上显示。很多情况下我们都希望后台的属性改变之后能够在前台的界面上也呈现出来这种变化。常见的这种通知变化的方式有两种,分别是:

1. 使用PropertyChangedEventHandler在属性改变的时候通知用户界面。

2. 使用依赖项属性。

 

例子:

XAML文件:

<TextBox   Text="{Binding Path=StudentAge}"

                       Grid.Row="3"

                       Grid.Column="2"

                       VerticalAlignment="Top" Margin="0,5,0,0" />

 

说明:在这个文件中放置了一个TextBox,该元素的Text属性与数据模型中的属性StudentAge

绑定。

C#文件:

 

       int _studentAge;

        public int StudentAge

        {

            get

            {

                return _studentAge;

            }

            set

            {

                _studentAge = value;

            }

        }

 

说明:在C#文件中虽然定义了StudentAge属性,并完成了与XAML的绑定,但是现在属性值改变的时候UI界面上不会发生改变。这就需要前面提到的两种处理方式去实现后台数据与前台UI之间的同步变化。

 

方式一:使用PropertyChangedEventHandler在属性改变的时候通知用户界面。

        #region INotifyPropertyChanged Members

 

        public event PropertyChangedEventHandler PropertyChanged;

 

        #endregion

 

        void OnPropertyChanged(string propertyName)

        {

            if (PropertyChanged != null)

                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

        }

        int _studentAge;

        public int StudentAge

        {

            get

            {

                return _studentAge;

            }

            set

            {

                _studentAge = value;

                OnPropertyChanged("StudentAge");      //这句代码很重要,用其通知前台界面//去改变

            }

        }

 

说明:首先申明一个PropertyChangedEventHandler事件,并实现OnPropertyChanged函数。用于触发事件,并通知用户界面改变。

 

小结:通过以上的方法就能够实现后台数据改变并在前台界面上显示的效果。这是一种方法。还有一种方法就是下面将要说明的依赖项属性。

 

方法二:依赖项属性

        public static readonly DependencyProperty StudentAgeProperty = DependencyProperty.Register("StudentAge",

                                                                                                   typeof (int),

                                                                                                   typeof (StudentData));

 

        public int StudentAge

        {

            get { return (int)GetValue(StudentAgeProperty); }

            set { SetValue(StudentAgeProperty, value); }

        }

 

说明:依赖项属性使用的时候只需要先创建一个依赖项的实例。如上面的StudentAgeProperty。创建的时候调用Register注册。注册函数的参数包含了属性名。然后按照上面的方式声明属性就可以了。

 

总结:在自定义类中一般都比较少使用依赖项属性,使用的时候用前面的第一种方式解决就可以了(使用依赖项属性的时候会出现错误,因为GetValue和SetValue函数都是来自于Control类的,自定义类继承于这个类才能使用这两个方法)。但是对于要扩展一个控件的属性的时候依赖项属性就比较有用了!