【发布时间】:2013-11-10 17:18:04
【问题描述】:
我正在寻找一种在 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)时,我从数据库中获得B的实例列表,并且需要在网格中显示这些实例等等.. .
- 我通过反射从插件 DLL 中获得了从
插件 DLL 是一个没有 xamls 的类库(我的用户也是制作此插件的人,我不希望他们为自己的实体编写
DataTemplates。 我也无法预先定义DataTemplates,因为我不知道在运行时之前需要显示的类型。每种类型都可以有不同类型和数量的属性。我在编译时只知道它们都来自Entity。- 网格也应该是可编辑的。
【问题讨论】:
-
为每个实体类型创建特定的 DataGrid,并使用
ContentPresenter在运行时切换视图。保持简单。 -
我不确定您是否需要更新从 Entity 派生的类型中的属性,以及这些更新是否需要显示在 ItemsControl 中。如果这样做,您将需要为这些属性实现 INotifyPropertyChanged 更改通知,或者将它们转换为 Dependency 属性。
-
如果您真的希望它们同时在一个网格中,您可以将视图模型属性设为 IEnumerable
类型。 -
@HighCore 我对这个问题做了一些更新,你能看看吗?到目前为止,我想出的最好的想法是通过反射迭代类型的属性并以编程方式创建它的列。有没有更简单的方法?
-
为什么不将
AutoGenerateColumns属性设置为True并让datagrid 根据您的对象公开的属性为您创建列?