14

我将 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。

这是为什么?如何让网格显示它继承的其他接口的成员?

更新 继承的接口定义简单的数据属性,如

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 的列表中返回。

4

2 回答 2

7

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

组件的属性可能与类的属性不同,因为如果组件位于站点,则站点可以添加或删除属性。

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

幸运的是,这种机制是可扩展的,您可以编写一个带有自定义属性信息实现的TypeConverter类。实现属性逻辑请参考 TypeConverter 文档中的备注。

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

然后使用 TypeConverterAttribute 属性将此自定义 TypeConverter 附加到您的界面。

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

于 2009-02-24T04:15:52.513 回答
-1

这是因为接口是一种契约,而与对象交互的唯一方式是通过该特定契约。在进行强制转换之前,其他接口不能被假定并且不能被使用。

因此,当您将 T 的列表绑定到某个东西时,数据网格不知道那些其他接口。并且数据网格不会使用反射来确定可能继承哪些其他类或接口。唯一可用于数据网格的对象属性是由 T 接口公开的属性。

如果您希望数据网格能够访问所有属性,则需要绑定 List。

于 2009-02-12T04:45:28.730 回答