Silverlight 2:动态创建对象的INotifyPropertyChanged?

时间:2009-05-20 21:41:48

标签: c# silverlight reflection dynamic

这与一个I asked earlier相同的问题但是一个人参考了正常的C#。 这是Silverlight 2,我没有 ICustomTypeDescriptor

所以这是问题:

我有几个开关面板(对于喜欢类比的人)。 这些开关面板中的每一个都具有名称(字符串)可以处于开启或关闭状态(布尔)的开关。 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 :(得分:0)

您可以创建一个派生的泛型字典string,bool,它实现了INotifyPropertyChanged。索引器可能如下所示:

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将交换机绑定到字典:

http://silverlight.net/forums/t/51864.aspx

通过这种方式,您仍然可以拥有名称的动态集合,每个名称都具有关联的bool值,并直接绑定到数据而无需创建动态类型。