C# INotifyPropertyChanged для свойств динамически созданного объекта?

(обновление) ICustomTypeDescriptor работает для моего приложения Windows Forms, но не для Silverlight; Не поддерживается. Я продолжу исследовать эту идею и посмотрю, куда я доберусь. (/Обновить)

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

Если вы знаете лучший способ сделать это, дайте мне знать. Пожалуйста.


person Dan    schedule 15.05.2009    source источник


Ответы (1)


Вероятно, вам не нужен динамический класс. Вы можете реализовать свойства привязки во время выполнения через ICustomTypeDescriptor/GetProperties(), создав собственную реализацию PropertyDescriptor, которая возвращает именованный переключатель. Неясно, кто первым узнает об изменении, но вы можете использовать либо INotifyPropertyChanged, либо более старое событие изменения свойства, опять же привязанное к каждому свойству (поэтому каждое PropertyDescriptor присоединяется, например, к событию в именованном переключателе.

Не тривиально, но и не невозможно.

person Marc Gravell    schedule 15.05.2009
comment
Как вы говорите, не тривиально, но определенно проще, чем создание динамического класса... - person Thomas Levesque; 15.05.2009
comment
Это может быть интересным способом сделать это, и это определенно пробуждает мое любопытство. Попробую и отчитаюсь. - person Dan; 18.05.2009
comment
Работал нормально, но не с другим проектом, потому что он в Silverlight (поскольку он не поддерживает ICustomTypeDescriptor, grrr). Отмечу как ответ, но любые идеи для Silverlight тоже будут хороши. - person Dan; 18.05.2009
comment
Когда я сказал, что работает нормально, я имел в виду, что это работает хорошо, если это кого-то смущает. - person Dan; 18.05.2009