数据绑定(二)(翻译)

** 改变属性的注意事项 ** ** : **

现在我们知道了数据绑定 , 下面我们看看对象如何支持自动属性改变 . 当我们在程序中改变对象的数据 , 很难让我们知道控件的改变 .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 事件 .

Published At
Categories with Web编程
Tagged with
comments powered by Disqus