2011-07-23 18 views
0

我有一個有數千個節點的集合。我希望每個節點都觸發一個Changed()事件來通知容器。C#可以使用單個EventHandler <EventArgs>數千個對象嗎?

正常情況下,註冊一個事件創建一個新的EventHandler <>:

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

這將導致數以千計的事件處理程序<>對象。

我想知道是否有可能建立一個單一的事件處理程序<>和上千個節點的同時使用它:

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

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

僅供參考 - Changed()事件是通知容器可能需要重新排序。想象一下,除了添加/刪除之外,使用Item setter的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

這看起來不錯!任何想法與常規活動相比如何?資源/速度?想知道是否有更多的閱讀來實現這個vs普通的香草事件。 –

1

絕對。你做了什麼應該可以正常工作。它不適合你嗎?

+0

如果合適,它似乎是實例化中的大量節省。補充說:我還沒有嘗試過,並不是因爲我認爲它不會起作用,但是如果這是有缺陷的並且會在生產中爆炸,我想要意見/經驗。 –

+0

是的,您也可以創建自己的事件標記並在需要時傳入其他標識符。或者只需獲取發件人節點並執行您的邏輯。 –

+0

沒錯。只需要通知(到目前爲止)。在提交之前需要輸入一些信息。 :) –

相關問題