2011-03-14 54 views
0

应该我有两个派生类(子,孙子女)类:PropertyChanged事件触发两次,不

BaseSample 
    |-ProcessData 
     |-Measurement 

在对测量类属性更改我提出一个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(),我只是测试,当你改变CrucibleOxidizedMass的价值会发生什么:

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子被调用两次,即使我只值分配给CrucibleOxidizedMass一次。

你有什么想法为什么它会被触发两次以及我如何纠正它?

+0

你可以显示你在哪里举办初始活动。 – msarchet 2011-03-14 14:11:47

+0

msarchet:在Sub Main()中,当我将20的值赋给CrucibleOxidizedMass属性时,这应该触发Measurement类中的PropertyChanged事件。在这个类中,我将PropertyChanged事件委托给RaiseMassChanged子类,它应该在正确的条件下提高OnCrucibleOxidizedMassChanged。正是这个事件导致模块中的OnChanged子被调用(并且只打印一次“发送报告的时间!”)。希望这可以澄清我的问题。谢谢。 – blueshift 2011-03-14 15:01:41

回答

0

我发现我的错误。我手动将LINQ to SQL类OnCrucibleOxidizedMassChanged中的PropertyChanged事件引发到O2Measurement。所以,我导致了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