2011-11-24 47 views
2

我已創建了可觀察列表的以下擴展模擬只讀行爲。ObservableList ReadOny Datagrid

public class WeirdList<T> : ObservableCollection<T> 
{ 

    public new void Add(T item) 
    { 
     throw new NotImplementedException("Add function not implemented."); 
    } 

    public new void Insert(int index, T item) 
    { 
     throw new NotImplementedException("Insert() not implemented."); 
    } 

} 

但是,如果我結合這有CanUserAddRows一個DataGrid = true,那麼當我通過圖形用戶界面上的數據網格中添加一行,則沒有例外的是扔但我可以看到該對象已被添加到儘管已經重寫了允許添加的明顯方法。

如果我嘗試在代碼中添加,如期望拋出異常。

任何幫助?

問候

回答

1

您尚未重寫功能,只是重新定義了它們。您需要使用override而不是new。網格可能會將數據源轉換爲ICollection,這意味着您的函數將不會被調用。只有當對象完全是你的類型時纔會使用它們。

正如在評論AddInsert中提到的是非虛擬的,覆蓋函數InsertItem代替。 (添加並插入兩者都在內部調用此函數)

+0

添加不聲明爲虛擬:http://msdn.microsoft.com/en-us/library/ms132404(v=vs.85).aspx –

+0

試圖爲InsertItem添加重寫,但沒有效果。 – Peter

+0

如果您重寫插入項目並向集合中添加項目(不使用網格),是否會拋出異常? – Magnus

0

你宣佈你的附加方法是這樣的:

public new void Add

陰影基類的版本。 DataGrid很可能使用基類的Add方法。

如果你宣佈你的網格將兵爲

ObservableCollection<T> Src = new WeirdList...

列表,然後將其更改爲

WeirdList<T> Src = new WeirdList...

由於ObservableCollection<T>Add方法並不像聲明虛擬的,因此不能被覆蓋。

如果這不起作用,那麼這將意味着網格正在鑄造您的收藏,從而避免您所有的辛苦工作,呈現你想做的事情是不可能的。

+0

我已將其他函數添加到我的WeirdCollection中,有些事件似乎會被調用罰款。我不明白數據網格如何作爲ICollection進行投射,但我的其他功能/事件仍處於工作狀態。 – Peter

+0

您成功更改的其他方法在ObservableCollection中聲明爲虛擬 ?? –