【问题标题】:Notify object references with some property changed通知具有某些属性更改的对象引用
【发布时间】:2020-09-18 16:01:20
【问题描述】:

我需要通知对象引用的属性发生变化,检查以下代码:

Public Class Symbol
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Private Sub NotifyPropertyChanged(<Runtime.CompilerServices.CallerMemberName> Optional ByVal propertyName As String = Nothing)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
    End Sub

    Private _Price As Decimal
    Public Property Price() As Decimal
        Get
            Return _Price
        End Get
        Set(ByVal value As Decimal)
            If Not (value = _Price) Then
                _Price = value
                NotifyPropertyChanged()
            End If

        End Set
    End Property
End Class
Public Class Position
    Public Symbol As Symbol

    Public Sub New(symbol As Symbol)
        Me.Symbol = symbol
    End Sub

    Public Sub PriceChanged()
        Debug.Print($"New Price {Symbol.Price}")
    End Sub

End Class

当 Symbol 价格发生变化时,如何让 PriceChanged 开始?

【问题讨论】:

  • 你看过AddHandler吗?
  • 是的,伙计,但如果可能的话,首先需要使用propertyChanged 实现。
  • 这就是INotifyPropertyChanged 模式的工作原理。您在 NotifyPropertychanged 生产者类中引发事件,并拥有侦听通知的消费者类。为此,您宣布了一个公共事件 (Public Event PropertyChanged)。
  • 你也可以使用 Bindings 和 BindingSource。

标签: .net vb.net oop interface inotifypropertychanged


【解决方案1】:

显而易见的解决方案是声明Symbol 字段WithEvents。然后,您可以将该字段包含在 Handles 子句中,就像您在表单上处理控件一样。您可以使用代码窗口顶部的导航栏来生成事件处理程序,就像使用表单上的控件一样:

Public Class Position

    Private WithEvents _symbol As Symbol

    Public Property Symbol As Symbol
        Get
            Return _symbol
        End Get
        Set
            _symbol = value
        End Set
    End Property

    Public Sub New(symbol As Symbol)
        Me.Symbol = symbol
    End Sub

    Public Sub Symbol_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) Handles _symbol.PropertyChanged
        Debug.Print($"New Price {Symbol.Price}")
    End Sub

End Class

我也冒昧地正确实施了课程的其余部分。

【讨论】:

  • 非常感谢,我已经尝试过这个解决方案,但是如果不可能,我会寻找一些东西而不是处理程序,我会继续使用它,再次感谢。
  • 您为什么不想这样做?如果您愿意,可以使用AddHandler,但它没有任何优势。如果您真的想这样做,那么我可以提供一个示例,但是如果没有充分的理由...
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2012-01-09
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多