Pregunta

Así WPF no admite el estándar de clasificación o el comportamiento de filtrado para las vistas de CompositeCollections, entonces, ¿cuál sería una mejor práctica para la solución de este problema.

Hay dos o más colecciones de objetos de diferentes tipos.Usted desea combinar en una sola que se puede ordenar y filtrar de la colección (dentro de tener que implementar de forma manual ordenar o filtrar).

Uno de los métodos que he pensado es crear un nuevo objeto de colección con sólo un par de núcleo de propiedades, incluyendo la que yo quiero la colección ordenada, y una instancia de un objeto de cada tipo.

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

Y, a continuación, recorrer mis dos colecciones de objetos para construir el nuevo compuesto de la colección.Obviamente esto es un poco de un método de fuerza bruta, pero funcionaría.Me gustaría obtener toda la vista predeterminada de clasificación y filtrado de comportamiento en mi nuevo compuesto de objetos de colección, y me gustaría ser capaz de poner una plantilla de datos para mostrar mi lista de elementos correctamente dependiendo de qué tipo es, en realidad, almacenados en la que el compuesto de partida.

¿Qué sugerencias hay para hacer esto de una manera más elegante?

¿Fue útil?

Solución 3

Actualización:He encontrado una manera mucho más elegante solución:

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

He encontrado que debido a la reflexión, el tipo específico almacenado en Obj1 se resuelve en tiempo de ejecución y el tipo específico de DataTemplate se aplica como se esperaba!

Otros consejos

Todavía no estoy muy familiarizado con WPF, pero yo veo esto como una pregunta acerca de la clasificación y filtrado List<T> las colecciones.

(dentro de tener que implementar de forma manual ordenar o filtrar)

Habría que reconsiderar la aplicación de su propia especie o de las funciones de filtro?En mi experiencia, es fácil de usar.Los siguientes ejemplos usan un anónimo delegado pero fácilmente podría definir su propio método o una clase para implementar un complejo de ordenar o filtrar.Una clase podría incluso tener propiedades para configurar y cambiar el tipo de filtro y de forma dinámica.

Uso List<T>.Sort(Comparison<T> comparison) con su costumbre de comparar la función:

// 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);
};

Un enfoque similar para la obtención de una sub-colección de elementos de la lista.

Uso List<T>.FindAll(Predicate<T> match) con su filtro personalizado de la función:

// 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);
}

"Fuerza bruta", método que mencionas es en realidad la solución ideal.La mente, todos los objetos están en la memoria RAM, no hay I/O cuello de botella, por lo que prácticamente se puede ordenar y filtrar los millones de objetos en menos de un segundo en cualquier ordenador moderno.

La forma más elegante para trabajar con colecciones de Sistema.Linq espacio de nombres en el .NET 3.5

Gracias - yo también considera LINQ to los objetos, pero mi preocupación es la pérdida de de flexibilidad para con los datos las plantillas, que tengo que mostrar el los objetos de mi lista.

Si usted no puede predecir en este momento cómo la gente va a ordenar y filtrar su colección de objetos, entonces usted debe buscar en Sistema.Linq.Expresiones espacio de nombres para construir sus expresiones lambda en la demanda durante el tiempo de ejecución (primera le permite al usuario construir expresión, a continuación, compilar, ejecutar y al final se utiliza la reflexión de espacio de nombres para enumerar a través de los resultados).Es más difícil de envolver su cabeza alrededor de él, pero valiosísima función, probablemente (a mí definitivamente) incluso más innovadora característica de LINQ en sí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top