繁体   English   中英

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

[英]Silverlight 2: INotifyPropertyChanged on dynamically created object?

这与我之前问过的一个问题是相同的,但我曾问过它是关于普通C#的。 这是Silverlight 2,我没有ICustomTypeDescriptor

所以这又是一个问题:

我有几个开关面板(适合那些喜欢类比的开关面板)。 这些开关面板中的每一个都具有名称(字符串)可以处于打开或关闭状态(布尔)的开关。 配电盘和开关是在其上具有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事件。 这意味着它将在事物发生变化时进行排序和/或分组。

您可以创建实现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将开关绑定到字典:

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

这样,您仍然可以拥有一个动态的Names集合,每个Names都有一个关联的bool值,并直接绑定到数据而无需创建动态类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM