gpt4 book ai didi

c# - WPF:在 MVVM 中创建未知类型绑定(bind)的最佳方式

转载 作者:太空狗 更新时间:2023-10-29 18:29:11 24 4
gpt4 key购买 nike

我正在寻找一种在 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,但是我可以将属性绑定(bind)到 DataGrid 的最佳方式是什么?由于属性可能很复杂,我还需要能够绑定(bind)到特定路径,例如 Address.HomeNum ...

说明

  1. 我一次只需要显示一个类型实例的网格。完整的场景是这样的:

    1. 我通过反射从插件 DLL 中获取了从 Entity 派生的类型列表
    2. 我在列表中显示他们的名字。 (在此示例中,该列表将包含 AB
    3. 当用户点击一个特定项目时,比方说 A,我从数据库中得到一个 A 实例的列表 - 到目前为止一切顺利。
    4. 我想在 DataGrid 中显示A 的实例列表
    5. 当用户从列表中选择另一个项目时(意味着另一种类型,比方说 B),我从数据库中得到一个 B 的实例列表,并且需要在网格中显示这些......
  2. 插件 DLL 是一个没有 xaml 的类库(我的用户也是制作此插件的人,我不希望他们必须编写 DataTemplate为他们的实体。我也无法制作预定义的 DataTemplate,因为我不知道在运行时之前需要显示的类型。每种类型可以具有不同类型和数量的属性。我在编译时只知道它们都是从 Entity 派生的。

  3. 网格也应该是可编辑的。

最佳答案

DataGrid 在这种情况下似乎不合适。如果您的列表绑定(bind)到两个独立的实体,它会严重崩溃。

更好的选择可能是使用其他一些 ItemsControl 并为每种类型的 Entity 设置一个 DataTemplate。这将允许您为每个实体构建自定义编辑器,并有一个要编辑的“列表”。

如果您知道实体将始终属于单一类型,我会改为构建该特定类型的集合并绑定(bind)到它。

关于c# - WPF:在 MVVM 中创建未知类型绑定(bind)的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19694015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com