(更新)ICustomTypeDescriptor 适用于我的 Windows 窗体应用程序,但不适用于 Silverlight;不支持。我会继续研究这个想法,看看我能到达哪里。 (/更新)
我有,比如一些开关面板(对于那些喜欢类比的人)。 这些开关面板中的每一个都有一个名称(字符串)可以处于开或关状态( bool )的开关。 开关面板和开关是具有 INotify 接口(interface)的对象。
使用开关名称,我在集合中创建了所有可能的开关名称的列表,并创建了一个将所有这些名称作为属性的动态类。
SwitchPanel1 (Switches( Switch1 ("Main",On) , Switch2("Slave",Off)))
SwitchPanel2 (Switches( Switch1 ("Bilge",On) , Switch2("Main",Off)))
产生一个集合
(Main,Bilge,Slave)
然后生成一个具有以下属性的动态类:
SwitchPanel : (SwitchPanel)
Main : (Switch)
Bilge : (Switch)
Slave: (Switch)
想法是,如果开关面板有一个带有属性名称的开关,则将其放置在该属性上。所以使用一点 linq
propeties["Main"].SetValue(newSwitchType,SwitchPanel.Switches.FirstOrDefault(sw => sw.Name == "Main"));
我想将这个新的动态类转换为 INotfyPropertyChanged 并捕获这些新属性的实际更改,因此如果开关更改状态,动态对象将报告它。
为什么?它需要显示在 ListView 中,我正在使用的 ListView 通过提供属性名称而不是绑定(bind)路径来进行绑定(bind)。
它还尝试通过针对 INotifyPropertyChanged 强制转换对象来捕获 INotify 事件。这意味着它会在事情发生变化时进行排序和/或分组。
如果您知道更好的方法,请告诉我。请。
最佳答案
您可能不需要动态类。您可以通过 ICustomTypeDescriptor
/GetProperties()
实现运行时绑定(bind)属性,创建您自己的返回指定开关的 PropertyDescriptor
实现。目前尚不清楚什么首先知道更改,但您可以使用 INotifyPropertyChanged
或旧的特定于属性的更改事件,再次绑定(bind)到每个属性(因此每个 PropertyDescriptor
例如,附加到命名开关中的事件。
不是微不足道的,但也不是不可能的。
关于C# INotifyPropertyChanged 动态创建对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/866725/