我将 IList 绑定到 GridView。 IMyInterface 看起来像
public interface IMyInterface: IHasTotalHours, IHasLines
{
DateTime GoalStartDate { get; set; }
DateTime GoalEndDate { get; set; }
}
我将一个实例绑定到网格,如下所示:
IList<IMyInterface> instance= GetMyData();
myGrid.DataSource = instance;
myGrid.DataBind();
当将此绑定到网格时,网格中显示的唯一成员是 IMyInterface 的直接成员:GoalStartDate 和 GoalEndDate。
这是为什么?如何让网格显示它继承的其他接口的成员?
Update继承的接口定义了简单的数据属性,例如
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 从数据源获取属性。在里面类型描述符.GetProperties http://msdn.microsoft.com/en-us/library/ybh0y4fd.aspx方法,您可以阅读以下内容:
组件的属性可以
与类的属性不同,
因为网站可以添加或删除
属性(如果组件已定位)。
显然,默认实现只会从接口返回直接属性,而不是继承的属性。
幸运的是,这个机制是可扩展的,你可以编写一个类型转换器 http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx具有自定义属性信息实现的类。属性逻辑的实现请参考TypeConverter文档中的备注。
自定义 TypeConverter 类的 GetProperties 实现可以在您的接口及其所有继承接口上调用 TypeDescriptor.GetProperties(Type)。但也许您甚至可以编写一个通用的 TypeConverter,它可以使用反射查找所有继承的属性。
然后,您可以使用 TypeConverterAttribute 属性将此自定义 TypeConverter 附加到您的界面。
然后,就像魔术一样,数据源将找到所有属性。 ;-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)