2012-06-25 161 views
0

我有一些組合框的WPF應用程序。每個ComboBox綁定到一個SortedList,讓我們把它稱爲數據源。我爲數據源選擇這種類型的原因很簡單,因爲我將獲得對TValues的更新以及新項目並可能刪除,儘管它們不太可能。當數據事件(添加,更新,刪除)發生時,我希望能夠更快更簡單地找到這些項目。然後我綁定到一個IList類型的屬性,並在getter中返回_mySortedList.Values。數據綁定排序的組合框

不過我很快就意識到,這是行不通的,因爲我沒有得到通過泵送到UI就像你使用一個ObservableCollection變化的通知。

所以我想知道什麼是最好的方法讓我的所有項目排序(排序條件永遠不會改變,但可以基於對象的多個屬性),並具有很好的ObservableCollection自動通知。

很多感謝任何幫助,您可以給。

回答

1

要做到這一點,最簡單的方法是創建一個實現INotifyCollectionChanged一個子類,也有排序功能。如果您已經在使用SortedList,那麼您可以簡單地創建一個從SortedList派生的類,實現INotifyCollectionChanged並重寫Add/Remove /等。方法來引發NotifyCollectedChanged事件。

它可能看起來像這樣(不完全):

public class SortedObservableList : SortedList, INotifyCollectionChanged 
{ 
    public override void Add(object key, object value) 
    { 
     base.Add(key, value); 
     RaiseCollectionChanged(NotifyCollectionChangedAction.Add); 
    } 

    public override void Remove(object key) 
    { 
     base.Remove(key); 
     RaiseCollectionChanged(NotifyCollectionChangedAction.Remove); 
    } 

    #region INotifyCollectionChanged Members 

    protected void RaiseCollectionChanged(NotifyCollectionChangedAction action) 
    { 
     if (CollectionChanged != null) 
      CollectionChanged(this, new NotifyCollectionChangedEventArgs(action)); 
    } 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    #endregion 
} 

或者,您可以創建一個從的ObservableCollection並實現排序功能派生的類,但如果你已經使用了,可能沒有意義排序列表。

編輯:下面您的意見和問題的進一步檢查表明您正在使用的排序列表(排序列表)的通用版本。在這種情況下,您可以讓SortableObservableList實現IDictionary接口(和/或ICollection,IEnumerable),並在內部使用SortedList存儲這些項目。這裏是你可以使用代碼的片段(不包括所有的實施方法,因爲它們只是道直通到您的內部排序列表。)

public class SortedObservableList<TKey, TValue> : IDictionary<TKey, TValue>, INotifyCollectionChanged 
{ 
    private SortedList<TKey, TValue> _list; 

    public SortedObservableList() 
    { 
     _list = new SortedList<TKey, TValue>(); 
    } 

    #region INotifyCollectionChanged Members 

    protected void RaiseCollectionChanged(NotifyCollectionChangedAction action) 
    { 
     if (CollectionChanged != null) 
      CollectionChanged(this, new NotifyCollectionChangedEventArgs(action)); 
    } 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    #endregion 

    #region IDictionary<TKey,TValue> Members 

    public void Add(TKey key, TValue value) 
    { 
     _list.Add(key, value); 
     this.RaiseCollectionChanged(NotifyCollectionChangedAction.Add); 
    } 

    public bool ContainsKey(TKey key) 
    { 
     return _list.ContainsKey(key); 
    } 

    public ICollection<TKey> Keys 
    { 
     get { return _list.Keys; } 
    } 

    public bool Remove(TKey key) 
    { 
     bool result = _list.Remove(key); 
     this.RaiseCollectionChanged(NotifyCollectionChangedAction.Remove); 
     return result; 
    } 

    //etc... 

    #endregion 
} 
+0

布賴恩您好,感謝您的建議。我不確定這種方法會給我綁定_mySortedList.Values。至少在初始數據綁定後發生數據時,它似乎不起作用。 – user630190

+0

我已編輯答案,以包含使用通用SortedList 時可以工作的方法。希望這會爲你工作。 –