2011-12-23 13 views
0

我有一個單獨的類,讓我們說一個字典的類2。我希望它能填充字典中的值。c#檢查字典是否通過事件處理程序更改了另一個類中的值?

public class Class2 
{ 
    public Class2() 
    { 
     public Dictionary<string, string> someDictionary = new Dictionary<string, string>(); 
     //I DON"T KNOW HOW TO CREATE AN EVENTHANDLER HERE FOR THE DICTIONARY 
     //how do i create the eventhandler if someDictionary changes? 
    } 
} 

讓我們Class1中說,我有我想,以填補在字典中的值,但是改變他們在Class2中的變化詞典列表視圖。

public class Class1 
{ 
    public Class1() 
    { 
      Class2 class2 = new Class2(); 
      class2.SomeDictionaryChanged += new EventHandler(someDictionary_SomeDictionaryChanged); 
    } 

    void someData_SomeDataChanged(object sender, EventArgs e) 
    { 
     listView1.Add(class2.someDictionary); 
    } 

} 

如何爲class2中的字典創建事件處理程序,以及如何檢查字典是否在class1中更改?

所有這是僞代碼,它不會編譯,我不知道如何做到這一點,因此,我問的問題。

+0

所示的代碼不會編譯,請您糾正它? – 2011-12-23 22:48:16

+0

這個問題沒有任何意義。如果字典是在構造函數中定義的,那麼一旦它完成執行,沒有值可以添加到它,所以有什麼意思讓它引發事件? – 2011-12-23 22:51:28

+1

詞典<>沒有事件。它不需要任何,只有你自己的代碼可以改變它。沒有「我自己改變了」的事件,你已經知道了。不過,ListView的確是一個允許用戶更改選擇的控件。除了你的控制,所以它有SelectedIndexChanged事件告訴你。 – 2011-12-23 23:09:06

回答

0

這是不可能的,從的角度來看,只使用字典

這裏的原因:

  1. Dictionary<TKey, TValue沒有任何事件
  2. 比較兩個Dictionary<TKey, TValue>對象,具有相同TkeyTValue類型和相同的內容,會比較false,只是因爲.Equals(x)上這樣的字典使用參考比較
  3. 通過.GetHashCode()檢查哈希碼將不起作用,因爲兩個差異字典實例的哈希碼可能不同,即使這些詞典具有相同的內容。

得到這樣的工作的唯一方法是有兩種方法:

  1. 子類Dictionary<TKey, TValue>和改變字典(請注意,我真的不記得是否詞典一切觸發事件型密封與否,即這是否確實是可能的)
  2. 結束語所有訪問底層的字典,並在適當的地方觸發事件
5

查看ObservableDictionary。 http://blogs.microsoft.co.il/blogs/shimmy/archive/2010/12/26/observabledictionary-lt-tkey-tvalue-gt-c.aspx

它實現INotifyCollectionChanged和INotifyPropertyChanged。 您可以處理一個字典中的CollectionChanged以更新另一個字典。

我還沒有測試過這個代碼,但它應該讓你朝着正確的方向發展。

public class Class2 : ObservableDictionary<string, string> 
{ 
    public Class2() 
    { 
    } 
} 
public class Class1 
{ 
    public Class1() 
    { 
     Class2 class2 = new Class2(); 
     class2.CollectionChanged += new OnCollectionChanged; 
    } 

    void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      foreach (KeyValuePair<string, string> kvp in e.NewItems) 
      { 
       listView1.Add(kvp.Value); 
      } 
     } 
    } 
} 

其中class1擴展了具有CollectionChanged事件的可觀察字典。 在class1中,您可以附加到class2的CollectionChanged事件並使用它將項目添加到您的列表視圖。

相關問題