C#INotifyPropertyChanged动态创建的对象的属性?

时间:2009-05-15 02:10:15

标签: c# linq reflection dynamic

(更新)ICustomTypeDescriptor适用于我的Windows窗体应用程序,但不适用于Silverlight;不支持。我会继续调查这个想法,看看我到达了哪里。 (/更新)

我有几个开关面板(对于喜欢类比的人)。 这些开关面板中的每一个都具有名称(字符串)可以处于开启或关闭状态(布尔)的开关。 switchpanel和switch是在其上具有INotify接口的对象。

使用开关名称,我在集合上创建所有可能的开关名称的列表,并创建一个动态类,其中包含所有这些名称作为属性。

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并捕获这些新属性的实际更改,因此如果一个开关改变状态,动态对象将报告它。

为什么呢?它需要显示在列表视图中,我正在使用的列表视图通过提供属性名称而不是绑定路径来进行绑定。

它还尝试通过针对INotifyPropertyChanged强制转换对象来捕获INotify事件。这意味着它会在事情发生变化时进行排序和/或分组。

如果你知道更好的方法,请告诉我。请。

1 个答案:

答案 0 :(得分:1)

您可能不需要动态类。您可以通过ICustomTypeDescriptor / GetProperties()实现运行时绑定属性,创建自己的PropertyDescriptor实现,返回指定的开关。目前尚不清楚首先了解更改的内容,但您可以使用INotifyPropertyChanged或更旧的特定于属性的更改事件,再次绑定到每个属性(因此每个PropertyDescriptor都附加到,例如,指定开关中的事件。

不是微不足道的,但也不是不可能的。