1

コレクションでアイテムがいつ追加/削除/変更されるかを知る必要がある状況があります。

これらのイベントをトリガーするクラスでBindingListを継承してみましたが、「adding」イベントが機能しません。私がそれが機能していることを発見した唯一の方法は、EndNew()メソッドをオーバーライドすることですが、このメソッドに追加されるオブジェクトを取得する方法が見つかりません(誰かがこれに対する解決策を持っているなら、それも大丈夫です!)

そのため、BindingListの同じインターフェイス/クラスから継承するまったく新しいクラスを構築し、すべてを実装しました(ただし、ICancelAddNewは継承しませんでした)。

データバインディングを介してリストボックスにバインドしましたが、何も機能しないことがわかりました(listchangedイベントもlistchangingイベントも)。リストボックスでBindingListの動作をシミュレートするにはどうすればよいですか?

どんな提案も大歓迎です、私は回避策のための他のアイデアを持っていません

編集1:

これは私のコレクションです:http://pastie.org/1978601 そしてこれは私がコレクションをリストボックスにバインドする方法です

        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");だけがあります。

4

3 に答える 3

2

あなたが探しているものを明確に理解した後、私は次のことを提案します

これは多くの機能を提供する素晴らしいundoフレームワークです。 http://undo.codeplex.com/

これがサンプルです、 http://blogs.msdn.com/b/kirillosenkov/archive/2009/07/02/samples-for-the-undo-framework.aspx

そして、あなたの場合、イベントの追加/編集にフックしようとするのではなく、初期状態を保存する場合は、追加/変更/削除されたイベントの後に追跡する方が良いでしょう。したがって、アイテムが削除された場合、プログラムの開始状態から追跡を開始した場合、以前の状態ではすでにアイテムがあります。

于 2011-06-01T06:13:37.817 に答える
2
  • コレクションは、アイテムがコレクションに追加されるときにアイテムのプロパティ変更イベントにフックしないため、既存のアイテムのプロパティ変更を検出しません。

  • BindingList<T>アイテムの PropertyChanged をリッスンし、アイテムが BindingList に追加されたときに ListChanged イベントを発生させ、それが追加されたインデックスを含みます。WinForms を使用しないテスト アプリで試してください。

  • 既存のアイテムを追加することは、AddNew() と同じではありません。StartingNew イベントは、AddNew() が呼び出されたときにのみ呼び出され、新しいインスタンスを提供できるようにします。

  • WinForms が関与すると、事態はさらに複雑になります。考えるべき CurrencyManager と BindingSource があります。イベントがまったく発生しない場合は、自分が使用していると思われる CurrencyManager/BindingSource を使用しているかどうかを確認してください。

  • フレームワークの何も INotifyPropertyChanging を使用しているとは思いません。元の INotifyPropertyChanged だけです。BindingList で Reflector を使用してフックがどのように行われるかを確認し、項目がサポートしている場合は INotifyPropertyChanging を組み込むことをお勧めします。

于 2011-06-01T10:09:47.417 に答える
2

MSDN のガイドラインに従っていますか? コレクション クラスは拡張CollectionBaseおよび実装IBindingListする必要があります。これで問題ありません。

また、操作をサポートするためにコレクションアイテムを実装することもできます。ただし、これは必須ではありません。さらに重要なこととして、コレクション アイテムには、変更時に親コレクションに通知する方法が必要です (MSDN で提供されているコードに従うか、たとえば を使用します)。IEditableObject*EditINotifyPropertyChanged


CustomersListドキュメント ページでカスタムを実装する実際のバインディング サンプルを見つけることができIBindingListます (Customerクラスはドキュメント ページで見つけることができIEditableObjectます)。

于 2011-05-25T07:53:02.713 に答える