viewdestroy code data-binding reflection interface multiple-inheritance typedescriptor

data-binding - code - navigation mvvmcross



EncuadernaciĆ³n IList<IMyInterfaceType> no muestra los miembros de las interfaces que IMyInterface hereda (2)

Estoy vinculando IList a un GridView. IMyInterface se ve como

public interface IMyInterface: IHasTotalHours, IHasLines { DateTime GoalStartDate { get; set; } DateTime GoalEndDate { get; set; } }

Ato una instancia a una Grilla como esta:

IList<IMyInterface> instance= GetMyData(); myGrid.DataSource = instance; myGrid.DataBind();

Cuando se vincula esto a la grilla, los únicos miembros que aparecen en la grilla son los miembros directos de IMyInterface: GoalStartDate y GoalEndDate.

¿Porqué es eso? ¿Cómo hago para que la grilla muestre los miembros de las otras interfaces que hereda?

Actualización Las interfaces heredadas definen propiedades de datos simples como

public interface IHasTotalHours { string Description { get; set; } int Hours{ get; set; } } public interface IHasLines { double TotalLines { get; set; } double LinesPerHour { get; set; } }

Hay una clase que implementa IMyInterface:

public class MyClass : IMyInterface { public string Description { get; set; } public int Hours { get; set; } public double TotalLines { get; set; } public double LinesPerHour { get; set; } public DateTime GoalStartDate { get; set; } public DateTime GoalEndDate { get; set; } }

Estos se emiten como IMyInterface, y se devuelven en la lista que estoy vinculando a GridView.


Es porque una interfaz es un contrato, y esa es la única forma de interactuar con un objeto a través de ese contrato específico. Las otras interfaces no se pueden suponer y no se pueden utilizar hasta que se realice un lanzamiento.

Entonces, cuando vincula una Lista de T a algo, la cuadrícula de datos no conoce esas otras interfaces. Y la cuadrícula de datos no va a usar la reflexión para descubrir qué otras clases o interfaces podrían heredarse. Las únicas propiedades de objeto que estarán disponibles para la cuadrícula de datos son las propiedades expuestas por la interfaz T.

Debe vincular List si desea que la cuadrícula de datos tenga acceso a todas las propiedades.


Los controles vinculados a datos no usan el reflejo sino un TypeDescriptor para obtener las propiedades de un origen de datos. En el método TypeDescriptor.GetProperties , puede leer lo siguiente:

Las propiedades de un componente pueden diferir de las propiedades de una clase, porque el sitio puede agregar o eliminar propiedades si el componente está ubicado.

Aparentemente, la implementación predeterminada solo devolverá las propiedades directas de una interfaz y no las heredadas.

Por suerte, este mecanismo es extensible y puede escribir una clase TypeConverter con implementación de información de propiedad personalizada. Consulte los comentarios en la documentación de TypeConverter para implementar la lógica de propiedad.

La implementación GetProperties de su clase TypeConverter personalizada puede llamar a TypeDescriptor.GetProperties (Type) en su interfaz y todas sus interfaces heredadas. Pero tal vez incluso podría escribir un TypeConverter genérico que encontraría todas las propiedades heredadas mediante el uso de la reflexión.

A continuación, conecte este TypeConverter personalizado a su interfaz con el atributo TypeConverterAttribute.

Y luego, como magia, la fuente de datos encontrará todas las propiedades. ;-)