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# - System.Reflection.TargetInvocationException;需要帮助理解

C# 结构变量在传递给非托管 C DLL 函数时保持为 null

c# - 检查属性的嵌套/层次结构是否为空?

c# - Silverlight 媒体播放器位置问题

silverlight - Windows Phone Navigation - 回传到之前的页面

silverlight - Silverlight 中的位图图像大小限制

Java类反射: init external class with wild card parameters

c# - .NET TreeView 不会显示图像

c# - Azure Web 应用程序加载缓慢且不热(加载 30 秒以上)

c# - 有没有办法确定 C# 4.0 中接口(interface)/委托(delegate)的方差?