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

时间:2009-02-12 00:53:19

标签: data-binding reflection interface multiple-inheritance typedescriptor

我正在将IList绑定到GridView。 IMyInterface看起来像

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

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

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

2 个答案:

答案 0 :(得分:7)

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

  

组件的属性可以   不同于一个类的属性,   因为该网站可以添加或删除   如果组件位于该属性,则为属性。

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

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

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

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

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

答案 1 :(得分:-1)

这是因为接口是契约,而这是与对象交互的唯一方法是通过该特定契约。其他接口不能被假设,并且在制作演员表之前无法使用。

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

如果希望datagrid可以访问所有属性,则需要绑定List。