0

我有一个带有许多组合框的 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 回答