これを行う最も簡単な方法は、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
}