这与一个问题相同 I asked earlier但那个是引用普通 C# 的。 这是 Silverlight 2,我没有 ICustomTypeDescriptor
那么问题又来了:
我有,比如一些开关面板(对于那些喜欢类比的人)。 这些开关面板中的每一个都有一个名称(字符串)可以处于开或关状态( 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 事件。这意味着它会在事情发生变化时进行排序和/或分组。
最佳答案
您可以创建一个实现 INotifyPropertyChanged 的字符串、 bool 派生通用字典。索引器可能如下所示:
public new bool this[string key]
{
get
{
if( this.ContainsKey(key))
return base[key];
return default(bool);
}
set
{
base[key] = value;
OnPropertyChanged(key.ToString());
}
}
在您的开关面板中使用自定义 IValueConverter 将开关绑定(bind)到字典:
http://silverlight.net/forums/t/51864.aspx
这样你仍然可以拥有一个动态的名称集合,每个名称都有一个关联的 bool 值,并直接绑定(bind)到数据而无需创建动态类型。
关于c# - 银光 2 : INotifyPropertyChanged on dynamically created object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/890401/