C# WPF:数据绑定到运行时命名的属性

C# WPF:数据绑定到运行时命名的属性,c#,wpf,data-binding,ironpython,C#,Wpf,Data Binding,Ironpython,我正在做一个项目,修改一种特定的二进制文件格式。规范的一部分是允许结构布局的XML定义,如下所示: <!-- Invalid plugin, for demonstration only --> <plugin name="weap"> <struct size="0x504"> <float32 name="initial_rounds_per_second" offset="0x4" /> <flo

我正在做一个项目,修改一种特定的二进制文件格式。规范的一部分是允许结构布局的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
类型的“Fields”属性中,其中string=>对象映射表示命名元素。然后WPF可以绑定到此字典,使用数据模板列出每个键/值对

然而,我对WPF缺乏经验,这使我的处境不稳,我的解决方案还提出了许多其他问题:

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

您不能在代码中创建绑定吗?让它更有活力

这表明可以通过以下方式实现:

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

你的字典方法很好。我在某些地方使用字典>。只要您理解它的局限性,例如,如果您修改其中一个集合(删除、插入、删除等),您就不会得到可观察集合本身从字典中获得的内置通知。如果您想要一个本身表现为“可观察”字典的字典,那么必须创建一个自定义类。我已经做到了这一点,它与一些调整工作得很好

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