我将IList绑定到GridView.IMyInterface看起来像
public interface IMyInterface: IHasTotalHours, IHasLines { DateTime GoalStartDate { get; set; } DateTime GoalEndDate { get; set; } }
我将一个实例绑定到Grid,如下所示:
IListinstance= GetMyData(); myGrid.DataSource = instance; myGrid.DataBind();
将此绑定到网格时,显示在网格中的唯一成员是IMyInterface的直接成员:GoalStartDate和GoalEndDate.
这是为什么?如何让网格显示其继承的其他接口的成员?
更新 继承的接口定义简单的数据属性,如
public interface IHasTotalHours { string Description { get; set; } int Hours{ get; set; } } public interface IHasLines { double TotalLines { get; set; } double LinesPerHour { get; set; } }
有一个实现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; } }
它们被转换为IMyInterface,并在我绑定到GridView的列表中返回.
数据绑定控件不使用反射,而是使用TypeDescriptor从数据源获取属性.在TypeDescriptor.GetProperties方法中,您可以阅读以下内容:
组件的属性可能与类的属性不同,因为如果组件所在的位置,站点可以添加或删除属性.
显然,默认实现只返回接口的直接属性而不是继承的属性.
幸运的是,这种机制是可扩展的,您可以使用自定义属性信息实现编写TypeConverter类.请参阅TypeConverter文档中的备注以实现属性逻辑.
自定义TypeConverter类的GetProperties实现可以在您的接口上调用TypeDescriptor.GetProperties(Type)以及它所有的继承接口.但也许你甚至可以编写一个通用的TypeConverter,通过使用反射找到所有继承的属性.
然后使用TypeConverterAttribute属性将此自定义TypeConverter附加到您的接口.
然后,像魔术一样,数据源将找到所有属性.;-)