【问题标题】:variable/property changed event in vb.netvb.net 中的变量/属性更改事件
【发布时间】:2011-01-01 01:11:08
【问题描述】:

如何创建一个在变量或属性更改时引发的事件(或者我可以将我要放入事件中的代码放在属性的 Set 部分中?

【问题讨论】:

    标签: .net vb.net events variables properties


    【解决方案1】:

    是的,最好的(如果不是唯一的)方法是完全隐藏实际变量(将其设为私有)并通过一个在使用 setter 时触发事件的属性将其公开。

    我经常这样做,但我发现如果新值与旧值相似,则不要引发事件很重要。这既消除了不必要的函数调用,有时也防止了递归事件。

    【讨论】:

    • 在未更改时不引发事件的好点子——我已经看到这会导致 WPF 数据绑定出现问题。
    • 事件通常没有任何实际需要,请记住,您几乎可以在 setter 中做任何事情。
    • 如果它们相似,你是什么意思?
    • @Jonathan,假设您有一个链接到名为 m_index 的私有整数的属性。在设置器中,引发事件之前,添加以下行: If (value = m_index) Then Return
    【解决方案2】:

    对此的规范事件是PropertyChanged 事件,它在INotifyPropertyChanged 接口中定义。你可以从你的属性设置者那里提出这个问题。 (请注意,VB.NET 不会为您引发事件:您必须包含引发它的代码。)

    如果您希望在更改时运行的代码在逻辑上属于您的类(例如,当余额更改时更新客户状态),那么将其放在属性设置器中而不是事件处理程序中是合适的。事件处理程序用于外部代码需要了解更改时,例如更新 UI 以响应客户状态的变化。

    【讨论】:

      【解决方案3】:

      看看this example INotifyPropertyChanged 接口的实现,这是用于此功能的标准方法。重要的部分是 NotifyPropertyChanged 方法和属性集处理程序中的代码。

      【讨论】:

        【解决方案4】:

        来自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 会有什么影响?
        • @luchosrock 就个人而言,我认为您必须手动引发您定义的事件有点缺乏。如果您可以让事件自动引发,那么我看到了定义事件的意义,否则,只需将代码 - 或对 Sub 的调用 - 放在 setter 中。
        猜你喜欢
        • 2016-07-09
        • 2012-06-30
        • 1970-01-01
        • 2020-01-26
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多