0

多数の ComboBox を持つ WPF アプリケーションがあります。各 ComboBox は SortedList にバインドされています。これをデータソースと呼びましょう。データソースにこのタイプを選択した理由は、単純に、TValues の更新と新しいアイテムを取得し、可能性は低いですが削除する可能性があるためです。データ イベント (追加、更新、削除) が発生したときに、アイテムをすばやく簡単に見つける方法が必要でした。次に IList 型のプロパティにバインドし、getter で _mySortedList.Values を返しました。

ただし、ObservableCollection の場合のように UI に送信された変更の通知を取得しないため、これはうまくいかないことにすぐに気付きました。

したがって、すべてのアイテムを並べ替え (並べ替え条件は変更されませんが、オブジェクトの複数のプロパティに基づいている可能性があります)、ObservableCollection の自動通知を行うための最良の方法は何だろうと考えています。

あなたが与えることができるどんな助けにも前もって感謝します。

4

1 に答える 1

1

これを行う最も簡単な方法は、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
}
于 2012-06-25T17:09:09.720 に答える