使用BindingList(Of Object) - CodeDom后期绑定

时间:2014-06-16 14:22:31

标签: c# vb.net data-binding

我正在尝试将BindingList与使用CodeDom在运行时创建的对象一起使用。但我想我已经遇到了一个晚期绑定墙。创建类型和DLL都运行良好,我可以访问属性,因此可以intellisense。但是BindingList或DataGridView控件无法使用它。

由于我的新Type在CodeDom方法之后的运行时才知道,所以我不能这样做:

Private myBList As BindingList(Of myDomType)

但这不起作用:

myBList = New BindingList(Of Object)
...
Dim obj = CreateNewDomObject(values())   ' values passed to the constructor
myBList.Add(obj)                         ' the DGV doesnt show the data

Of Object显然不会使用已知类型的wvwn:

myBList = New BindingList(Of Object)
...
myBList.Add(New Foo)                        ' Foo is a known Type

显然DGV或BindingList不会打扰后期绑定对象。所以我尝试了这个:

Public MustInherit Class myObject
   ... 2 trivial properties
End Class

然后更改CodeDom生成器以使创建的CodeDom类继承自myObject。这是为了提供一个具体的绑定类型并允许:

myBList = New BindingList(Of myObject)      ' a concrete type
...
Dim obj = CreateNewDomObject(values())      ' returns a myObject type   
myBList.Add(obj)

此编译没有后期绑定警告,但数据仍未显示在DGV中。在列表中存在合法myObject之后,我还尝试设置/重置DGV DataDisplayNames。当它只是Object时,我可以理解这不起作用,但当CodeDom Type继承自已知类型时,它不能解释为什么它不起作用。

那么,可以做这样的事情(如果是这样,那么诀窍是什么)?是否有我可以在CodeDom源中使用的属性或使用TypeDescriptor的技巧?

1 个答案:

答案 0 :(得分:1)

尝试使用DataTable后代类。我之前使用第三方网格控件在生产环境中使用了这种方法 - 它工作正常。也应该使用DataGridView。