Вопрос

Таким образом, WPF не поддерживает стандартное поведение сортировки или фильтрации для представлений CompositeCollections, поэтому рекомендуется решить эту проблему.

Существует две или более коллекции объектов разных типов.Вы хотите объединить их в одну сортируемую и фильтруемую коллекцию (без необходимости вручную реализовывать сортировку или фильтрацию).

Один из рассмотренных мной подходов — создать новую коллекцию объектов, содержащую всего несколько основных свойств, включая те, по которым я хотел бы отсортировать коллекцию, и экземпляр объекта каждого типа.

class MyCompositeObject
{
    enum           ObjectType;
    DateTime       CreatedDate;
    string         SomeAttribute;
    myObjectType1  Obj1;
    myObjectType2  Obj2;
{
class MyCompositeObjects : List<MyCompositeObject> { }

А затем просмотрите две мои коллекции объектов, чтобы создать новую составную коллекцию.Конечно, это немного грубый метод, но он сработает.Я получу все функции сортировки и фильтрации представлений по умолчанию в моей новой коллекции составных объектов и смогу поместить в нее шаблон данных для правильного отображения элементов моего списка в зависимости от того, какой тип фактически хранится в этом составном элементе.

Какие есть предложения, как сделать это более элегантным способом?

Это было полезно?

Решение 3

Обновлять:Я нашел гораздо более элегантное решение:

class MyCompositeObject
{
    DateTime    CreatedDate;
    string      SomeAttribute;
    Object      Obj1;
{
class MyCompositeObjects : List<MyCompositeObject> { }

Я обнаружил, что из-за отражения конкретный тип, хранящийся в Obj1, разрешается во время выполнения, и DataTemplate конкретного типа применяется, как и ожидалось!

Другие советы

Я еще не очень знаком с WPF, но рассматриваю это как вопрос о сортировке и фильтрации. List<T> коллекции.

(без необходимости вручную реализовывать сортировку или фильтр)

Вы бы пересмотрели реализацию собственных функций сортировки или фильтра?По моему опыту, им легко пользоваться.В приведенных ниже примерах используется анонимный делегат, но вы можете легко определить свой собственный метод или класс для реализации сложной сортировки или фильтра.Такой класс может даже иметь свойства для динамической настройки и изменения сортировки и фильтрации.

Использовать List<T>.Sort(Comparison<T> comparison) с вашей собственной функцией сравнения:

// Sort according to the value of SomeAttribute
List<MyCompositeObject> myList = ...;
myList.Sort(delegate(MyCompositeObject a, MyCompositeObject b) 
{
    // return -1 if a < b
    // return 0 if a == b
    // return 1 if a > b
    return a.SomeAttribute.CompareTo(b.SomeAttribute);
};

Аналогичный подход для получения подколлекции элементов из списка.

Использовать List<T>.FindAll(Predicate<T> match) с вашей пользовательской функцией фильтра:

// Select all objects where myObjectType1 and myObjectType2 are not null
myList.FindAll(delegate(MyCompositeObject a)
{
    // return true to include 'a' in the sub-collection
    return (a.myObjectType1 != null) && (a.myObjectType2 != null);
}

Упомянутый вами метод «грубой силы» на самом деле является идеальным решением.Имейте в виду, все объекты находятся в оперативной памяти, здесь нет узких мест ввода-вывода, поэтому на любом современном компьютере вы можете сортировать и фильтровать миллионы объектов менее чем за секунду.

Самый элегантный способ работы с коллекциями — пространство имен System.Linq в .NET 3.5.

Спасибо - я также рассмотрел LINQ для объектов, но я обеспокоен потерями гибкости для шаблонов напечатанных данных, которые мне нужно отобразить объекты в моем списке.

Если вы в данный момент не можете предсказать, как люди будут сортировать и фильтровать вашу коллекцию объектов, вам следует посмотреть System.Linq.Expressions пространство имен для создания лямбда-выражений по требованию во время выполнения (сначала вы позволяете пользователю создавать выражение, затем компилируете, запускаете и в конце используете пространство имен отражения для перечисления результатов).Это сложнее понять, но это бесценная функция, возможно (для меня определенно) даже более новаторская функция, чем сам LINQ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top