.net PropertyChanged事件激发两次,不应

.net PropertyChanged事件激发两次,不应,.net,vb.net,.net,Vb.net,我有一个包含两个子类(子类、孙子类)的类: 当度量类I中的属性更改时,引发OnCrucibleOxidizedMassChanged事件: Protected Sub AddEventHandler(ByVal thisMeasurement As CalcinerDataAccess.O2Measurement) AddHandler thisMeasurement.PropertyChanged, AddressOf RaiseMassChanged End Sub Prote

我有一个包含两个子类(子类、孙子类)的类:

当度量类I中的属性更改时,引发OnCrucibleOxidizedMassChanged事件:

Protected Sub AddEventHandler(ByVal thisMeasurement As CalcinerDataAccess.O2Measurement)

    AddHandler thisMeasurement.PropertyChanged, AddressOf RaiseMassChanged

End Sub

Protected Sub RaiseMassChanged(ByVal sender As Object, ByVal e As EventArgs)

    Dim CrucibleOxidizedMassReadyToReport As Boolean = _
        (TypeOf e Is System.ComponentModel.PropertyChangedEventArgs) AndAlso _
        (CType(e, System.ComponentModel.PropertyChangedEventArgs).PropertyName = "CrucibleOxidizedMass" And _
            CType(sender, CalcinerDataAccess.O2Measurement).CrucibleOxidizedMass IsNot Nothing)

    If CrucibleOxidizedMassReadyToReport Then
        RaiseEvent OnCrucibleOxidizedMassChanged(sender, e)

    End If

End Sub
出于测试目的,我有一个模块测试此事件引发行为。请注意,ToteBinSample继承自BaseSample。在Main()中,我只是测试更改CrossbleOxidazedMass的值时会发生什么:

Sub Main()


    thisSample = New SampleTypeManager.SampleTypes.ToteBinSample
    AddHandler thisSample.OnCrucibleOxidizedMassChanged, AddressOf OnChanged

    thisSample.SampleData.ProcessDatas(0).O2Measurements(0).CrucibleOxidizedMass = 20

    Console.WriteLine("Done...")
    Console.Read()


End Sub

Private Sub OnChanged(ByVal sender As Object, ByVal e As EventArgs)

    Console.WriteLine("Time to send report!")

End Sub
然而,OnChanged子会被调用两次,即使我只给crucbleoxidazedmass赋值一次


你知道为什么它会被解雇两次吗?我怎么才能纠正它?

我发现了我的错误。我在LINQ to SQL类O2Measurement的onCrucibleOxidedMassChanged子类中手动引发了PropertyChanged事件。因此,我导致了PropertyChanged事件的第二次触发。谢谢你,msarchet和其他思考过这个问题的人

Partial Class O2Measurement

    Private Sub OnCrucibleOxidizedMassChanged()
        'Here is my mistake -- I have removed it in my code
        RaiseEvent PropertyChanged(Me, New ComponentModel.PropertyChangedEventArgs("CrucibleOxidizedMass"))

    End Sub
End Class

能否显示引发初始事件的位置。msarchet:在Sub Main()中,当我将值20指定给CrossbleOxidazedMass属性时,这将在度量类中引发PropertyChanged事件。在这个类中,我将PropertyChanged事件委托给RaiseMasChanged子类,它应该在正确的条件下引发OnCrucibleOxidizedMassChanged。正是这个事件导致调用模块中的OnChanged子模块(并且只打印一次“发送报告的时间”)。希望这能澄清我的问题。谢谢
Partial Class O2Measurement

    Private Sub OnCrucibleOxidizedMassChanged()
        'Here is my mistake -- I have removed it in my code
        RaiseEvent PropertyChanged(Me, New ComponentModel.PropertyChangedEventArgs("CrucibleOxidizedMass"))

    End Sub
End Class