2011-07-23 4 views
0

私は数千のノードを持つコレクションを持っています。私は各ノードがコンテナに通知するためにChanged()イベントを発生させたいと思います。これは、EventHandlerの<>オブジェクトの数千人につながるC#何千ものオブジェクトに対して単一のEventHandler <EventArgs>を使用できますか?

Node node = new Node(); 
node.Changed += new EventHandler<EventArgs>(OnChanged); 

通常は、イベントを登録すると、新しいEventHandlerの<>を作成します。

私は単一のEventHandler <を構築することが可能であるかどうかを知りたい>と数千ノードと同時に、それを使用したい:

class Container { 
    EventHandler<EventArgs> eventHandler = 
     new EventHandler<EventArgs>(OnChanged); 

    void CreateNode() { 
    Node node = new Node(); 
    node.Changed += eventHandler; 
    } 
} 
+0

FYI Changed()イベントは、再ソートが必要な可能性があることをコンテナに通知することです。 Add/Removeに加えてItemセッターを持つSortedSet <>を想像してみてください。 –

答えて

2

はい、あなたがすることができます:MSDNに説明するようにSystem.Collections.ObjectModel.ObservableCollection<T>を参照:http://msdn.microsoft.com/en-us/library/ms668604.aspx

をここではそれがプロパティが変更されていたときに通知したサンプルクラスである:それは発射するため

public class Person : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string firstName 
    public string FirstName 
    { 
     get { return this.firstName; } 
     set 
     { 
      if(this.firstName == value) 
      { 
       return; 
      } 

      this.firstName = value; 
      this.RaisePropertyChanged("FirstName"); 

     } 
    } 

    private void RaisePropertyChanged(string propertyName) 
    { 
     if(this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

その後System.Collections.ObjectModel.ObservableCollection<T>を使用次のようなイベントが発生します。

`CollectionChanged` - Occurs when an item is added, removed, changed, moved, or the entire list is refreshed 

`PropertyChanged` - Also an implementation of INotifyPropertyChanged inteface, which fires when the collection's own properties change. 
+0

ホットダム! MSDN: "バインドされたクライアントとデータソース間のバインディングで変更通知が発生するには、バインドされた型は次のいずれかである必要があります。INotifyPropertyChangedインターフェイスを実装する(推奨)。 **どのように私はクライアントノードをデータソースにバインドしようとしているのですか?** –

+0

@Kevin R私はこれをSilverlightとWPFで動作させます。あなたの問題は私の仕事と非常に似ていたようでした。 – bleepzter

+0

これは素晴らしいですね!それはどのように定期的なイベントに比べてどのようなアイデア?リソース/スピード?このプレーンなバニライベントを実装するために少し読書をすることに利点があるかどうか分かります。 –

1

絶対に。あなたがしたことはうまくいくはずです。あなたのために働いていないのですか?

+0

適切であれば、インスタンシエーションの大幅な節約に見えます。追加:私はまだそれを試していない、私はそれが動作するとは思わないためではないが、これは欠陥であり、生産で爆破するつもりなら、意見/経験が欲しかった。 –

+0

はい、独自のeventargを作成し、必要に応じて他の識別子を渡すこともできます。または、送信側ノードを取得してロジックを実行してください。 –

+0

ちょうど通知が必要です(これまでのところ)。コミットする前に少しの入力を求めました。 :) –

関連する問題