2010-07-27 57 views
1

我正在使用WPF和C# 我有一個按鈕,打開一個窗口,其中還包括一個按鈕,將一個用戶對象項添加到列表框,我希望列表框索引被更新插入後。我明白,解決方案是關於使用INotifyCollectionChanged的可觀察類,但實際上我不知道如何以及在哪裏使用它們。你能不能幫我確定什麼,在哪裏實施,登記,消防等添加一個新項目後更新列表框


編輯: 我成功了這個由在我的用戶對象被收集在一個列表Quartermeister的幫助,但現在我想要做的同樣的東西,我的對象被收集在一本字典中

回答

4

最簡單的方法是使用System.Collections.ObjectModel.ObservableCollection<T>作爲您的列表。這爲您執行INotifyCollectionChangedINotifyPropertyChanged

您將在此類型的DataContext對象上擁有一個屬性,並使用ListBox.ItemsSource上的數據綁定將其綁定到該屬性。當收藏發生變化時,ListBox將自動更新其元素列表。

在那是你的DataContext類:

public class MyClass 
{ 
    public ObservableCollection<string> Items { get; set; } 
} 

在XAML:

<ListBox ItemsSource="{Binding Items}"> 
</ListBox> 

這聽起來像你還需要一個觀察的字典,但遺憾的是沒有一個建成該框架。您可以嘗試使用Dr.Wpf的"Can I bind my ItemsControl to a dictionary?"後的ObservableDictionary實現。

+0

這是一個相當簡單和有用的解決方案。非常感謝=) – cemregoksu 2010-07-27 12:41:38

+0

還有一個問題: 如果我想使用字典而不是列表該怎麼辦?我該如何處理? – cemregoksu 2010-07-27 12:43:59

+0

我剛剛發現了一個keyedcollection ,現在正在嘗試it.i希望它的工作=)t – cemregoksu 2010-07-27 12:45:32

0

實現可觀察字典很難。維護一個平行的可觀察集合(包含字典值)的集合更爲簡單。將視圖綁定到該集合,並確保將任何代碼添加到字典或從字典中刪除值的代碼都會更新字典和並行集合。

如果你真的想瘋了,你可以實現的ObservableCollection子類來保存你的對象,使該類維持詞典,如:

public class KeyedObject 
{ 
    public string Key { get; set; } 
    public object Value { get; set; } 
} 

public class ObservableMappedCollection : ObservableCollection<KeyedObject> 
{ 
    private Dictionary<string, KeyedObject> _Map; 

    public ObservableMappedCollection(Dictionary<string, KeyedObject> map) 
    { 
     _Map = map;  
    } 

    protected override void InsertItem(int index, KeyedObject item) 
    { 
     base.InsertItem(index, item); 
     _Map[item.Key] = item; 
    } 

    protected override void RemoveItem(int index) 
    { 
     KeyedObject item = base[index]; 
     base.RemoveItem(index); 
     _Map.Remove(item.Key); 
    } 

    protected override void ClearItems() 
    { 
     base.ClearItems(); 
     _Map.Clear(); 
    } 

    protected override void SetItem(int index, KeyedObject item) 
    { 
     KeyedObject oldItem = base[index]; 
     _Map.Remove(oldItem.Key); 
     base.SetItem(index, item); 
     _Map[item.Key] = item; 
    } 
} 

有一堆的潛在問題上面,主要是與重複鍵值有關。例如,如果你要添加一個鍵值已經在地圖上的對象,應該怎麼做SetItem?答案真的取決於你的應用程序。像這樣的問題也暗示爲什麼框架中沒有可觀察的字典類。