最简单的方法是创建一个实现 INotifyCollectionChanged 并且还具有排序功能的子类。如果您已经在使用 SortedList,那么您可以简单地创建一个派生自 SortedList、实现 INotifyCollectionChanged 并覆盖 Add/Remove/etc 的类。引发 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 并实现排序功能的类,但如果您已经在使用 SortedList,这可能没有意义。
编辑:您在下面的评论和对问题的进一步审查表明您正在使用 SortedList (SortedList) 的通用版本。在这种情况下,您可以让 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
}