改变属性的注意事项:
现在我们知道了数据绑定,下面我们看看对象如何支持自动属性改变. 当我们在程序中改变对象的数据,很难让我们知道控件的改变.UI和对象可以得到我们看不到的正确数据.
我们需要的是对象在任何时间提醒UI,属性值的改变.而这些我们可以通过事件的声明来
体现,当数据绑定时,数据绑定是根据事件的的属性改变,这些属性是对象的属性名称.
举例:我们刚才的ORDER类定义了一个ID属性,当数据绑定到控件时,绑定就开始倾听
ID属性改变这个事件.ID改变事件发生,则相应的对象也改变.
我们可以通过声明这些事件来说明我们的ORDER类:
Public Class Order
Public Event IDChanged As EventHandler
Public Event CustomerChanged As EventHandler
这些事件通过EventHandler来声明.这就需要数据绑定知道这些事件,如果我们不声明
这些事件的话,当数据绑定时候就会产生例外.在WINDOWS窗口中EVENTHANDLE
是一个标准的事件模型.这些事件是通过sender和EVENT来定义的.利用事件声明,我们确保
属性变化时,事件也要产生.SET中是最佳时期,我们利用ID属性来实现一下:
Public Property ID() As String
Get
Return mID
End Get
Set(ByVal Value As String)
mID = Value
RaiseEvent IDChanged(Me, New EventArgs())
End Set
End Property
我们建立一个触发器来捕捉ID属性的任何时候任何地方的变化,很多的类是通过SET方法来给变量付值的.这就需要我们及时的事件来出发这些值的改变.举个比较好的例子,ORDER类有很多的LINEITEM连接对象,先让我们看看LINEITEM类的变量声明:
Public Class LineItem
Public Event ProductChanged As EventHandler
Public Event QuantityChanged As EventHandler
Public Event PriceChanged As EventHandler
Public Event AmountChanged As EventHandler
Private mProduct As String
Private mQuantity As Integer
Private mPrice As Double
有四个事件,但只有三个有变量, Amount 属性通过数量和价格来计算.
Public ReadOnly Property Amount() As Double
Get
Return mQuantity * mPrice
End Get
End Property
这是一个只读属性,但我们可改动.事实上其他价格数量的改变它也随之改变,因此我们需要事件来捕捉它,例如价格改变:
Public Property Price() As Double
Get
Return mPrice
End Get
Set(ByVal Value As Double)
mPrice = Value
RaiseEvent PriceChanged(Me, New EventArgs())
RaiseEvent AmountChanged(Me, New EventArgs())
End Set
End Property
由于价格的改变,我们不光做PRICECHANGED事件,还要触发事件,这样才能使AMOUNT属性改变的正确.这些代码是我们能够及时发现数据变动的事件.
那就是说我们的AMOUNTCHANGED事件不要严格,当数据绑定到对象属性上时,数据绑定是倾听PROPERTYCHANGED事件.一旦这些时间触发,对象的控件就会更新.
换句话说,如果窗体控件绑定到PRICE和AMOUNT属性上,窗体触发的PRICECHANGED
事件,不光是使PRICE属性更新,同样AMOUNT属性也得到了更新.
如果我们仅仅绑定AMOUNT,UI由于没出发AMOUNTCHANGED事件使得我们的UI不能正常工作,正是这个原因,我们需要为每个属性声明PROPERTYCHANGED事件.