2011-08-08 17 views
1

我使用ObservableCollection作爲我的一些綁定的ItemsSource,並且遇到了我想手動調用OnCollectionChanged以通知綁定引擎需要重新檢查列表的場景。 (BindingList類似物是OnListChanged)。爲什麼在嘗試從ObservableCollection或BindingList的子類中獲取NullReferenceException?

這是麻煩開始的地方。令人難以置信的是,這些方法是protected,不能在沒有繼承這些類型的情況下調用。 Ironpython supports this,但是當我試圖子類,它引人注目的失敗 - 甚至當我不指定任何重寫方法:

>>> class ObservableCollectionEx(System.Collections.ObjectModel.ObservableCollection): 
...  pass 
... 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
SystemError: Object reference not set to an instance of an object. 

>>> class BindingListEx(System.ComponentModel.BindingList): 
...  pass 
... 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
SystemError: Object reference not set to an instance of an object. 

我快要放棄的時候,和所有我想做的事是使一個受詛咒致電OnCollectionChanged!幫幫我!

+0

你能告訴我們任何一種類型的定義嗎? – JaredPar

回答

0

做一些更多的研究,我已經找到了解決辦法後的樣本。閱讀this article on inheriting from generic classes揭示了是怎麼回事幕後,最主要的是這個解釋一些輕:

關閉構造一般是用來指這樣一個場景,一個子類是非泛型和基類是術語參數化爲具體類型。

public class SubClass : BaseClass<int> {...} 

打開構造一般是用來指一個方案,其中兩個基和亞類參數化爲一般類型的術語。

public class SubClass<T> : BaseClass<T> {...} 

根據這一點,我想要在我原來的職位(從ObservableCollectionsBindingLists繼承)做的是第二種形式;試圖保持基類和子類參數化。雖然我仍然認爲這個在IronPython中可能以某種方式可能,我無法弄清楚它的語法,所以我現在要解決第一種形式。和whaddaya知道,它的工作原理:

>>> class BindingListEx(System.ComponentModel.BindingList[str]): 
...  pass 
... 
>>> 
>>> b = BindingListEx() 
>>> b 
<BindingListEx object at 0x000000000000002C> 
>>> b.Add(3) 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
TypeError: expected str, got int 
>>> b.Add("cow") 
>>> 

因此,在這個例子中,BindingListEx是不通用的,從已經餵養str其參數BindingList參數基類的子類。這現在工作。如果有人想知道如何進行Open Construct通用繼承(那是第二種形式),請隨時在這裏發佈,這樣你就可以得到接受的答案,因爲這是我最初的目標。現在,這將不得不做。

1

子分類ObservableCollection<T>BindingList<T>是支持的操作。下面是我寫的BindingList<T>暴露OnListChanged並不會引發任何異常

class BindingListEx<T> : BindingList<T> 
{ 
    public void ForceListChanged() 
    { 
     base.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, 0)); 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     var list = new BindingListEx<int>(); 
     list.Add(42); 
     list.ForceListChanged(); 
    } 
} 
+0

謝謝,但我的問題是在Ironpython(如果這不能在c#中工作,那將會很難過)。我可能會缺少的是在類定義中顯示部分的語法;我不知道Ironpython會怎麼做,或者如果它在這裏甚至需要。 – Aphex

+1

@Aphex IronPython使用'[int]'替代'',但我不確定是否可以在IronPython中聲明泛型類型。這似乎是你問題的根源。 – JaredPar

相關問題