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

标签 c# linq reflection dynamic

(更新)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/

相关文章:

c# - 列表在不应该使用重复数据时填充

c# - MediaInfo 在 C# 中动态检查 AudioStreams

c# - 使用 LINQ 和匿名类型进行透视?

C# Linq - 无法将 IEnumerable<string> 隐式转换为 List<string>

C#反射绑定(bind)结果Linq2Sql to list

c# - 我可以使用反射更改 C# 中的私有(private)只读字段吗?

c# - XML 序列化 DateTime 的默认格式

c# - 在存储过程中将 nvarchar 数据类型转换为 datetime 数据类型

c# - 避免在 xml 文件中重复输入 c#

java - 从 XML 文档动态生成 Java 类