闲话WPF之十五(WPF的数据处理 [2])

上一个Post当中,我叙述了WPF中的数据绑定相关的一堆理论知识。现在,我们将对其中的某些方面通过实例做进一步的分析。

在介绍WPF数据绑定源的种类时,第一种就是任意的CLR对象。这里需要注意的是WPF虽然支持任意的CLR对象,但是一个普通的CLR对象类却不行。我们还需要在CLR对象类上实现一种变化通知机制。

WPF把这种通知机制封装在了INotifyPropertyChanged接口当中。我们的CLR对象类只要实现了这个接口,它就具有了通知客户的能力,通常是在属性改变后通知绑定的目标。

下面是一个简单的例子,实现了一个支持通知功能的Camera类:

using System;

using System.ComponentModel;

using System.Windows.Media.Media3D;

namespace LYLTEST

{

    public class Camera : INotifyPropertyChanged

    {

        private PerspectiveCamera m_Camera;

        public event PropertyChangedEventHandler PropertyChanged;

        public Camera()

        {

            m_Camera = new PerspectiveCamera();           

        }

        private void NotifyPropertyChanged(String info)

        {

           if (PropertyChanged != null)

            {

                PropertyChanged(this, new PropertyChangedEventArgs(info));

            }

        }

         public PerspectiveCamera CameraProp

        {

            get { return m_Camera; }

            set

            {

                if (value != m_Camera)

                {

                    this.m_Camera = value;

                    NotifyPropertyChanged("CameraProp");

                }

            }

        }

    }

}

这一段代码很简单,首先引入类中使用的INotifyPropertyChangedPerspectiveCamera需要的名字空间。这里与普通CLR类的区别在于首先有一个公有的PropertyChangedEventHandler事件类型。然后我们在.NET属性包装CameraProp判断属性是否发生了变化,如果是,则用当前是属性名称字符串“CameraProp”调用另一个私有函数NotifyPropertyChanged。由它根据属性的名称构造一个PropertyChangedEventArgs对象,并完成对PropertyChanged的调用。它才是属性变化时真正应该调用的一个通知事件。

最后一点,如果我们需要通知所以的属性都发生了变化,则将上面的属性字符串“CameraProp”用参数NULL替代即可。
posted @ 2006-12-29 10:14  赖仪灵  阅读(5573)  评论(9编辑  收藏  举报