当前位置:  开发笔记 > 编程语言 > 正文

绑定IList <IMyInterfaceType>不显示IMyInterface继承的接口成员

如何解决《绑定IList<IMyInterfaceType>不显示IMyInterface继承的接口成员》经验,为你挑选了1个好方法。

我将IList绑定到GridView.IMyInterface看起来像

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

我将一个实例绑定到Grid,如下所示:

IList instance= 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的列表中返回.



1> Bart Verkoei..:

数据绑定控件不使用反射,而是使用TypeDescriptor从数据源获取属性.在TypeDescriptor.GetProperties方法中,您可以阅读以下内容:

组件的属性可能与类的属性不同,因为如果组件所在的位置,站点可以添加或删除属性.

显然,默认实现只返回接口的直接属性而不是继承的属性.

幸运的是,这种机制是可扩展的,您可以使用自定义属性信息实现编写TypeConverter类.请参阅TypeConverter文档中的备注以实现属性逻辑.

自定义TypeConverter类的GetProperties实现可以在您的接口上调用TypeDescriptor.GetProperties(Type)以及它所有的继承接口.但也许你甚至可以编写一个通用的TypeConverter,通过使用反射找到所有继承的属性.

然后使用TypeConverterAttribute属性将此自定义TypeConverter附加到您的接口.

然后,像魔术一样,数据源将找到所有属性.;-)


为了完整性,TypeConverter主要适用于PropertyGrid之类的东西; 对于网格,更常见的是使用ITypesList或TypeDescriptionProvider - 或者有时(不常见)ICustomTypeDescriptor(在第0项) - 但很少使用TypeConverter.
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有