我正在寻找一种在编译时未知类型的情况下,在 DataGrid
中显示数据的方法。
我有以下基础类:
public abstract class Entity
{
// Some implementation of methods ...
}
在运行时,我加载一个插件DLL并使用反射获取所有派生自Entity
的类型列表。例如:
public class A : Entity
{
public LocalAddress Address{ get; set; }
}
public class B : Entity
{
public Vendor Vendor { get; set; }
public string Name { get; set; }
}
然后我从数据库中检索他们的实例列表
public IEnumerable<Entity> Entities { get; set; } // A list of instances of type A for example
Entities
是DataGrid的ItemsSource
,但我应该如何最好地将属性绑定到DataGrid
?
由于属性可能很复杂,我还需要能够绑定到特定路径,例如Address.HomeNum
...
澄清
我只需要一次显示一个类型的实例网格。完整的场景是这样的:
- 通过反射从插件DLL中获取派生自
Entity
的类型列表 - 在列表中显示它们的名称。 (在此示例中,该列表将包含
A
和B
) - 当用户单击特定项时,例如
A
,我从DB获取A
实例列表-到目前为止都很好。 - 我想在
DataGrid
中显示A
实例的列表。 - 当用户选择列表中的另一个项目(意味着另一种类型,比如
B
)时,我从DB获取B
的实例列表,并需要在网格中显示它们,以此类推...
- 通过反射从插件DLL中获取派生自
插件DLL是没有xamls的类库(也是我的用户制作这些插件的人,我不希望他们必须为其实体编写
DataTemplate
。 我还不能制作预定义的DataTemplate
,因为在运行时之前我不知道需要显示的类型。每种类型都可以具有不同类型和数量的属性。在编译时,我只知道它们都派生自Entity
。- 该网格也应该是可编辑的。
AutoGenerateColumns
属性设置为True
,让datagrid根据对象公开的属性为您创建列呢? - Rohit VatsEmployee.Devision.IsNew
,而且我不能简单地覆盖 Devision 的 ToString 方法,因为我希望该列是一个复选框,因为 IsNew 属性是布尔值... - Omri Btian