【问题标题】:Implementing a bindable object with dynamic properties实现具有动态属性的可绑定对象
【发布时间】:2011-03-17 19:37:25
【问题描述】:

我正在尝试在 C# 中创建一个可以绑定到网格视图的对象。我有三个目标来实现这一目标。条目表、条目行和条目值。一个EntryTable 包含一个EntryRows 列表,一个EntryRow 包含一个EntryValues 列表。一个 Entry 值对象由一个属性名和一个值组成。

数据结构如下:

public class EntryTable 
{
    private List<EntryRow> _lERTable = null;
    ...

public class EntryRow
{
    private List<EntryValue> _lEVRow = null;
    ...

public class EntryValue
{
    private string _sFieldName;
    private string _sValue;
    ...

我知道默认情况下可绑定对象只会绑定到顶级可见属性。结果,我只看到一个 EntryRow 对象名称列表,如下所示:

-------------------------------------------
Norseman.CommandN.Data.CNStore.EntryRow    |
-------------------------------------------
Norseman.CommandN.Data.CNStore.EntryRow    |
------------------------------------------

我的最终目标是能够将填充的 EntryTable 绑定到网格,并让 EntryTable 对象识别所有 EntryRows 中的所有属性名称并将数据显示为网格。 问题是不是每个 EntryRow 都有相同数量的 EntryValues。 例如,如果我存储员工,一些员工可能没有经理属性。

我希望这样处理数据:

First Name |    Last Name  |     Position             |     Manager
-----------------------------------------------------------------
Andrew     |    Milton     |    Software Developer    |     null
-----------------------------------------------------------------
Barry      |   Singleton   |    Web Developer         |     Marcus Manicotti

我曾考虑将我的数据输入到传统的 System.Data.DataTable 模型中,但我更愿意实现自己的对象以避免开销。

在这件事上的任何帮助将不胜感激。

【问题讨论】:

    标签: c# dynamic properties bindable


    【解决方案1】:

    如果您使用的是 WinForms,则可以在集合上实现 ITypedList。如果您使用的是 WPF,则可以在每个项目上使用 ICustomTypeDescriptor

    【讨论】:

    • 因为我的属性实际上是每个 EntryValue 中的字符串,所以我不确定如何实现 ITypedList 以便我可以从 _sFieldName 字段中提取属性名称和从 _sValue 字段中提取值。我真的很欣赏正确方向的观点。看来我有点走上正轨了。
    • 我认为无论如何你都必须弄清楚你想为属性名称使用什么......即使它们是任意的(“Property1”、“Property2”等)
    • 这是不幸的部分。我的数据库后端设置为实体、属性、值模式,以便我可以将任意数量的属性应用于实体。我的目标是建立一个系统,以便我可以获取具有任何属性的实体列表并将其绑定到网格并将数据拼凑在一起以创建所有内容的主列表。
    • 如果一组实体的属性不明确,您可以遍历列表中的实体列表并获取所有唯一属性。
    • 嗯...我可以轻松创建唯一字段列表。但是,关于如何实现 ITypedList 的文档似乎有点参差不齐。关于如何为我的网格手动定义这些属性的任何想法?
    猜你喜欢
    • 2011-08-29
    • 2023-03-29
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多