【问题标题】:WPF: Databinding to properties named at runtimeWPF:数据绑定到在运行时命名的属性
【发布时间】:2024-09-27 14:55:01
【问题描述】:

我正在开发一个用于修改特定类型的二进制文件格式的项目。规范的一部分是允许结构布局的 XML 定义,如下所示:

<!-- Invalid plugin, for demonstration only -->
<plugin name="weap">
    <struct size="0x504">
        <float32 name="initial_rounds_per_second" offset="0x4" />
        <float32 name="final_rounds_per_second" offset="0x8" />
        <float32 name="rounds_per_second_acceleration" offset="0xA" />
        <float32 name="rounds_per_second_deceleration" offset="0xC" />
        <uint16 name="projectiles_per_shot" offset="0x6E" />
        <array name="magazines" offset="0xF0">
            <struct size='112'>
                <uint16 name="rounds_recharged" offset="0x4" />
                <uint16 name="rounds_total_initial" offset="0x6" />
                <uint16 name="rounds_total_maximum" offset="0x8" />
                <uint16 name="rounds_loaded_maximum" offset="0xA" />
            </struct>
        </array>
    </struct>
</plugin>

这些 XML 插件在运行时加载并用于解释二进制文件。我在 Python 中有一个工作原型,它在运行时解释这些插件并基于它们生成类。

我的麻烦在于 WPF 数据绑定——WPF 需要知道它将在编译时绑定到的属性的名称。我想将 WPF GUI 数据绑定到这些插件定义的数据结构,所以我有点麻烦。

如何将数据绑定到直到运行时才知道名称的属性?

我能想到的唯一暂定解决方案是将所有这些信息存储在 Dictionary&lt;String,Object&gt; 类型的“字段”属性中,其中字符串 => 对象映射表示命名元素。然后 WPF 可以绑定到这个字典,使用数据模板列出每个键/值对。

但是,我对 WPF 的缺乏经验让我陷入了困境,我的解决方案引发了许多其他问题:

  • 这种字典方法是解决问题的好方法吗?
  • 我应该使用哪种可观察数据类型?
  • 如果字典中的一个值被更新,WPF 是否需要刷新整个集合?
  • 如果字典包含数百个键/值对,我会遇到性能问题吗?

【问题讨论】:

    标签: c# wpf data-binding ironpython


    【解决方案1】:

    你不能在代码中创建绑定吗?使其更具活力。

    这个MSDN page 表明它可能通过:

    //make a new source
    MyData myDataObject = new MyData(DateTime.Now);      
    Binding myBinding = new Binding("MyDataProperty");
    myBinding.Source = myDataObject;
    myText.SetBinding(TextBlock.TextProperty, myBinding);
    

    【讨论】:

      【解决方案2】:

      您的字典方法非常好。我在某些地方使用了 Dictionary >。只要您了解它的局限性,这就会很好地工作,例如,如果您修改其中一个集合(删除、插入、删除等...),您将不会从字典中获得内置通知 你从 observable 集合本身得到的。如果您想要一个本身表现为“可观察”字典的字典,则必须创建一个自定义类。我已经完成了这项工作,并且经过一些调整后效果很好。

      就性能而言,这实际上取决于您如何使用它。我的自定义字典非常类似于具有可观察集合 TValue 的典型字典的性能。

      【讨论】: