Silverlight 2: INotifyPropertyChanged на динамически создаваемый объект? - PullRequest
2 голосов
/ 21 мая 2009

Это тот же вопрос, что и у одного , который я спрашивал ранее НО, что этот был по отношению к обычному C #. Это Silverlight 2, и у меня нет ICustomTypeDescriptor

Итак, снова вопрос:

У меня есть, скажем, несколько панелей переключателей (для тех, кто любит аналогии). Каждая из этих панелей переключателей имеет переключатели, у которых Имя (строка) может быть в состоянии (bool), Вкл или Выкл. Коммутационная панель и коммутаторы являются объектами с интерфейсом 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 И отловить фактические изменения этих новых свойств, поэтому, если состояние переключателя изменяется, динамический объект сообщит об этом.

Почему? Он должен отображаться в виде списка, а используемый у меня вид списка имеет привязку, предоставляя имя свойства, а не путь привязки.

Он также пытается перехватить события INotify, приводя объект к INotifyPropertyChanged. Это означает, что он будет сортировать и / или группировать, когда все изменится.

1 Ответ

0 голосов
/ 21 мая 2009

Вы можете создать производный универсальный словарь строк, 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, и привязываться непосредственно к данным, не создавая динамический тип.

...