2011-05-24 37 views
1

我有一種情況,我需要知道什麼時候項目是要在集合中添加/刪除/修改創建一個像BindingList一樣的自定義集合,它與ListBox一起創建一個ListChanging事件

我試圖通過在將觸發這些事件的類中繼承BindingList,但「添加」事件不起作用。我發現它工作的唯一方法是通過重寫EndNew()方法,但是我沒有找到一種方法來獲取哪個對象將被添加到這個方法(如果有人有這個解決方案,也沒關係!)。因此構建了一個全新的類,該類繼承自BindingList的相同接口/類並實現了一切(但我沒有繼承,但ICancelAddNew)。

我通過數據綁定將它綁定到我的列表框,並發現沒有任何工作(listchanged事件既不listchanging事件)。如何模擬列表框上的BindingList行爲?

任何建議大力讚賞,我沒有的解決方法,任何其他的想法

編輯1:

這是我收集:http://pastie.org/1978601 這是我收集綁定到ListBox

 SpellCasterManager.CurrentProfile.ButtonsMacro.ListChanged += new ListChangedEventHandler(ButtonsMacro_ListChanged); 
     SpellCasterManager.CurrentProfile.ButtonsMacro.ListChanging += new Expand.ComponentModel.ListChangingEventHandler(ButtonsMacro_ListChanging); 
gumpButton.DataBindings.Add("Value", SpellCasterManager.CurrentProfile.ButtonsMacro, "GumpIndex", false, DataSourceUpdateMode.OnPropertyChanged); 

實際上,在訂閱事件下,只有一個MessageBox.Show(「bla」);

+0

也許你應該張貼的東西更多關於「爲什麼」要知道,當一個項目將被添加/刪除/修改?因爲如果您想在此之前阻止某些UI操作,則可以設置某種事件或綁定來禁用添加/刪除/修改操作,同時某些活動正在處理中。 – 2011-05-31 09:32:11

+0

我想要做的是將每個屬性的「上一個值」存儲到列表中,因爲我想將它用於類似於Ctrl + Z的東西 – 2011-06-01 04:16:57

+0

因此,明確地說,您想要撤消/重做功能爲您的應用程序?那麼你可能不得不改變很多東西,因爲屬性和集合中的每一次更改都需要存儲爲可以應用或刪除的工作單元。有一些codeplex項目提供了一些框架來實現Undo/Redo。 – 2011-06-01 06:05:53

回答

1
  • 您的集合將無法檢測到現有項目中的屬性更改,因爲它在添加到集合時沒有掛入項目的屬性中更改的事件。

  • BindingList<T>不會在您的項目上偵聽PropertyChanged,並且在將項目添加到BindingList時會觸發ListChanged事件,並且它會包含添加的索引。在沒有WinForms的測試應用程序中試用它。

  • 添加現有項目與AddNew()不同。 AddingNew事件僅在調用AddNew()時被調用,並允許您提供新實例。

  • 當涉及到WinForms時,事情變得更加複雜。有CurrencyManager考慮和BindingSource。如果沒有事件觸發,請檢查是否使用您認爲自己的CurrencyManager/BindingSource。

  • 我不認爲框架中的任何東西使用INotifyPropertyChanging,只有原始的INotifyPropertyChanged。您可能希望在BindingList上使用Reflector來查看掛鉤是如何完成的,然後嘗試合併INotifyPropertyChanging(如果項目支持它)。

+0

好的,雖然你的回答談論很多事情,但重要的是第一個:我的收藏沒有掛鉤事件。不過,我認爲CollectionBase會爲我處理;我錯了。現在它正在以這種方式工作。 – 2011-06-01 14:50:18

2

您是否遵循MSDN指南?你的收藏類應該延伸CollectionBase並執行IBindingList - 那應該沒問題。

此外,您可能希望你的收藏項目爲了支持*Edit操作以實現IEditableObject。然而,這並不是必需的 - 更重要的是,收集項目應該有一種方式來在收集項目更改時通知父項收集(通過遵循MSDN上提供的代碼或使用例如INotifyPropertyChanged)。


你可以找到工作IBindingList文檔頁面定製CustomersList實施結合樣品(Customer類可以在IEditableObject文檔頁面中找到)。

+0

感謝您的回答,我正在測試。我會告訴你關於這方面的消息,再次感謝。 – 2011-05-26 12:15:38

+0

它不起作用,我的意思是,事件不會被解僱 – 2011-05-26 14:04:52

+0

@ Fire-Dragon-DoL:你能發表一些代碼嗎?從集合中添加''方法,以及如何綁定以控制..? – 2011-05-26 20:40:39

2

得到的您正在尋找我會建議以下幾點

什麼明確的想法後這裏是一個偉大撤銷框架,它提供了很多的功能。 http://undo.codeplex.com/

這是樣品, http://blogs.msdn.com/b/kirillosenkov/archive/2009/07/02/samples-for-the-undo-framework.aspx

而在你的情況,而不是試圖勾上添加/編輯的事件,它的更好,如果你保存它們的初始狀態跟蹤後添加/修改/刪除的事件。因此,如果該項目被移除,則在之前的狀態下,如果您從程序的開始狀態開始跟蹤,則已經有該項目。

+0

上發佈代碼正如我在答案中所寫的,我更喜歡命令模式方法而不是記憶方法,這就是爲什麼我需要跟蹤更改事件,並且我設法使其工作。 – 2011-06-01 14:51:16