c# - 银光 2 : INotifyPropertyChanged on dynamically created object?

标签 c# silverlight reflection dynamic

这与一个问题相同 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/

相关文章:

c# - 通过反射调用方法时的模糊匹配

c# - 什么是整体类型?

c# - 如何在安装过程中创建文件夹?

c# - 在哪里可以找到使用中的 C#///xml 文档注释的好示例?

wpf - bool 动画锁定属性

Java:如何加载已经在类路径上的类(及其内部类)?

c# - XNA Sprite 旋转点

silverlight - 将 Hunspell 与 Silverlight 结合使用

wcf - WCF TCP 和 HTTP 端点可以有相同的端口吗?

java - `String.class` 和 `new Class[]{String.class}` 有什么区别?