[英]event is not null but _invocationList is null?
我以為如果我有這段代碼:
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null) PropertyChanged(this, e);
}
並且沒有鈎住PropertyChanged
事件, ProeprtyChanged
將為null
,但是我得到的PropertyChanged
不為null且_invocationList
成員為null
且_invocationCount
成員為0。這(我認為)在我調用時導致ArgumentOutOfRangeException PropertyChanged(this, e)
。 知道問題可能在哪里嗎?
這是我在OnClick
事件中的堆棧跟蹤:
位於System.Windows.Forms.BindingsCollection.get_Item(Int32索引)處於System.Windows.Forms.BindingManagerBase.PushData處的System.Windows.Forms.PropertyManager.OnCurrentChanged處於System.Collections.ArrayList.get_Item(Int32索引) (EventArgs EA)位於System.Windows.Forms.BindToObject.PropValueChanged(Object sender,EventArgs e)在System.EventHandler.Invoke(Object sender,EventArgs e)在System.ComponentModel.PropertyDescriptor.OnValueChanged(Object component,EventArgs e) System.ComponentModel.ReflectPropertyDescriptor.OnValueChanged(對象組件,EventArgs e)位於C:\\ Users \\ Juan Luis中的Player.DataBaseManager.OnPropertyChanged(PropertyChangedEventArgs e)中的System.ComponentModel.ReflectPropertyDescriptor.OnINotifyPropertyChanged(Object component,PropertyChangedEventArgs e) \\ Documents \\ CodeWebScraper Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs:C:\\ Users \\ Juan Luis \\ My Dropbox \\ Docume中Player.DataBaseManager.set_TableNames(列出1值)處的第100行 nts \\ CodeWebScraper sin Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs:C:\\ Users \\ Juan Luis \\ My Dropbox \\ Documents \\ CodeWebScraper sin Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs中Player.DataBaseManager.UpdateTableNames()的第30行: C:\\ Users \\ Juan Luis \\ My Dropbox \\ Documents \\ CodeWebScraper中Player.DataBaseManager.ExecuteNonQuery(String sqlQuery)的第95行sin Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs:WebScraperAndPlayer.DataBaseEditor.deleteTableButtonButton_Click的第336行C:\\ Users \\ Juan Luis \\ My Dropbox \\ Documents \\ CodeWebScraper sin Player \\ WebScraperAndPlayer \\ BuilderForm2 \\ Data \\ DataBaseEditor.cs:System.Windows.Forms.ToolStripItem.RaiseEvent中的第90行的EventArgs e)(Object key,EventArgs e)在System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
查看您的堆棧跟蹤
在System.Windows.Forms.BindingsCollection.get_Item(Int32索引)在System.Windows.Forms.BindingManagerBase.PushData(布爾值和成功)在System.Windows.Forms.BindingsCollection.get_Item(Int32索引)在
這與事件連線無關緊要,在數據綁定中還有其他問題。
System.EventHandler.Invoke(對象發送者,EventArgs e)
那是PropertyChanged(this,e)調用。 這不是異常的原因,您的堆棧跟蹤已經遠遠超出了此范圍。 不幸的是,在您未編寫的代碼中,它是Winforms綁定管道的一部分。 捆綁物弄砸了。
找到了問題。 我有一個數據表編輯器,該表具有一個TablesList
屬性,該屬性綁定到數據庫管理器對象中的數據表列表。 在其set
訪問器中,我檢查了表是否仍然存在於列表中,以及是否沒有關閉編輯器並從數據庫管理器中刪除了數據綁定。 因此,當.NET的內部遍歷綁定到TablesList
的對象時,其中一個將自身從列表中刪除。 但是由於循環的編寫方式,.NET不會注意到此更改:
int numLinks = Bindings.Count;
for (int i = 0; i < numLinks; i++) {
if (Bindings[i].PushData()) {
success = false;
}
}
我基本上是從PushData()
調用中刪除綁定。 我的解決方案是將事件處理程序附加到PropertyChanged
事件並檢查那里的表列表。 顯然,.NET使用什么循環遍歷事件的調用列表,都可以讓您在循環中刪除事件。
我想這可能是:永遠不要從該屬性的set
訪問器中刪除更新該屬性的Binding
; 但可以從事件處理程序本身中刪除事件處理程序。 對?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.