WPF Bind to Collection объектов, отсортированных по идентификаторам, хранящимся в порядке в другой коллекции в C # - PullRequest
1 голос
/ 02 октября 2008

Для тех из вас, кто любит головоломки: у меня недавно была эта проблема, и я уверен, что должно быть более хорошее решение.

Рассмотрим:

  • ObservableCollection Foo объектов, называемых foos .
  • Foo содержит поле идентификатора строки
  • У меня нет контроля над foos
  • foos будет меняться

Тогда:

  • У меня есть еще одна коллекция под названием sortLikeThis
  • sortListThis содержит строки
  • Строки - это идентификаторы в том порядке, в котором должны быть показаны foos

Plus:

  • В foos могут быть объекты с идентификатором, которого нет в sortLikeThis . Эти должны идти в конце.
  • Аналогично, в sortLikeThis могут быть строки, которые не отображаются в foos .

Есть ли хороший способ привязать и показать в wpf объекты Foo в foos в порядке, определяемом идентификаторами в sortLikeThis ?

Ответы [ 2 ]

2 голосов
/ 02 октября 2008

Вы смотрели на Bindable LINQ ? Он позволяет определять запросы LINQ поверх наблюдаемой коллекции и гарантирует, что запрос LINQ выполняется каждый раз при изменении базовой коллекции. В вашем случае вы можете добавить запрос Orderby поверх коллекции.

Вы можете передать метод Orderby делегату для сравнения. Чтобы настроить это, вы бы

  1. Подготовьтесь, создав словарь, отображающий каждый идентификатор в sortLikeThis по возрастанию int
  2. Внутри делегата сравнения ищите в словаре идентификаторы двух foos, которые передаются для сравнения. Сделайте соответствующую вещь, если предмет не может быть найден.
2 голосов
/ 02 октября 2008

Похоже на работу для настраиваемой наблюдаемой коллекции, которая реализует IEnumerable и имеет довольно маленький перечислитель (ааа, yield), который обрабатывает логику настраиваемой сортировки.

public class SortFoosLolThx : ObservableCollection<Foo> {
public IList<string> SortList {/*...*/}
/*...*/
public override IEnumerator<Foo> GetEnumerator() { /*...*/ yield foo; /*...*/}
}
...