Я сделал класс-оболочку вокруг SortedList. Я добавляю объекты в этот класс, ожидая, что они будут автоматически отсортированы по алфавиту, но когда я привязываюсь к ListBox в WPF, я вижу их в несортированном порядке.
public class SortedObservableCollection<T> : ICollection<T>, INotifyPropertyChanged, INotifyCollectionChanged where T : INotifyPropertyChanged//, IComparable<T>
{
private readonly SortedList<string,T> _innerSortedList;
public SortedObservableCollection()
{
_innerSortedList = new SortedList<string, T>();
}
public void Add(T item)
{
_innerSortedList.Add(item.ToString(), item);
this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");
this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item);
item.PropertyChanged += ItemPropertyChanged;
}
void ItemPropertyChanged(object sender, PropertyChangedEventArgs e)
{
throw new NotImplementedException();
}
public void Clear()
{
_innerSortedList.Clear();
}
public bool Contains(T item)
{
return _innerSortedList.ContainsKey(item.ToString());
}
public void CopyTo(T[] array, int arrayIndex)
{
throw new NotImplementedException();
}
public int Count
{
get { return _innerSortedList.Count; }
}
public bool IsReadOnly
{
get { throw new NotImplementedException(); }
}
public bool Remove(T item)
{
bool success = _innerSortedList.Remove(item.ToString());
if (success)
{
item.PropertyChanged -= ItemPropertyChanged;
this.OnPropertyChanged("Count");
this.OnPropertyChanged("Item[]");
this.OnCollectionChanged(NotifyCollectionChangedAction.Remove, item);
}
return success;
}
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _innerSortedList.GetEnumerator();
}
protected virtual void OnPropertyChanged([CallerMemberName] String propertyName = "")
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
protected virtual void OnCollectionChanged(NotifyCollectionChangedAction action, object item)
{
if (this.CollectionChanged != null)
{
this.CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, item));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public event NotifyCollectionChangedEventHandler CollectionChanged;
}
Чтобы связать, я просто делаю:
SortedObservableCollection<IRCUser> Users { get; private set; }
.. fill users...
lstUsers.ItemsSource = users;
Пример ввода:
5Muhammad0
2Muhammad1
5Muhammad2
Вывод также показывает подобное, с теми, которые начинаются с 2, 4 и т. д., пронизанными между 5-ми.
Примечание. Мой класс IRCUser
действительно реализовал IComparable, но, поскольку теперь мне нужна только алфавитная сортировка, я закомментировал внедрение, надеясь, что сортировка по умолчанию сработает.
ПРИМЕЧАНИЕ 2. Я переопределил метод toString(), о котором забыл упомянуть:
public override string ToString()
{
return (int)Type + Nick;
}
ОБНОВИТЬ :
Кажется, внутри sortedList
поддерживается правильный порядок, но он не передается ListBox
в правильном порядке...
(int)Type
не являетсяstring
, компилируется ли ваше переопределение? - person Jodrell   schedule 15.07.2013SortedList
-string
, вы получите реализациюIComparable<string>
по умолчанию, которая является алфавитной. - person Jodrell   schedule 15.07.2013