【发布时间】:2011-01-01 01:11:08
【问题描述】:
如何创建一个在变量或属性更改时引发的事件(或者我可以将我要放入事件中的代码放在属性的 Set 部分中?
【问题讨论】:
标签: .net vb.net events variables properties
如何创建一个在变量或属性更改时引发的事件(或者我可以将我要放入事件中的代码放在属性的 Set 部分中?
【问题讨论】:
标签: .net vb.net events variables properties
是的,最好的(如果不是唯一的)方法是完全隐藏实际变量(将其设为私有)并通过一个在使用 setter 时触发事件的属性将其公开。
我经常这样做,但我发现如果新值与旧值相似,则不要引发事件很重要。这既消除了不必要的函数调用,有时也防止了递归事件。
【讨论】:
对此的规范事件是PropertyChanged 事件,它在INotifyPropertyChanged 接口中定义。你可以从你的属性设置者那里提出这个问题。 (请注意,VB.NET 不会为您引发事件:您必须包含引发它的代码。)
如果您希望在更改时运行的代码在逻辑上属于您的类(例如,当余额更改时更新客户状态),那么将其放在属性设置器中而不是事件处理程序中是合适的。事件处理程序用于外部代码需要了解更改时,例如更新 UI 以响应客户状态的变化。
【讨论】:
看看this example INotifyPropertyChanged 接口的实现,这是用于此功能的标准方法。重要的部分是 NotifyPropertyChanged 方法和属性集处理程序中的代码。
【讨论】:
来自MSDN library entry INotifyPropertyChanged.PropertyChanged Event:
Public Class DemoCustomer
Implements INotifyPropertyChanged
Private customerNameValue As String = String.Empty
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
Public Property CustomerName() As String
Get
Return Me.customerNameValue
End Get
Set(ByVal value As String)
If Not (value = customerNameValue) Then
Me.customerNameValue = value
NotifyPropertyChanged("CustomerName")
End If
End Set
End Property
End Class
【讨论】:
Set 部分中添加Sub 会有什么影响?