C # INotifyPropertyChanged на свойствах динамически созданного объекта? - PullRequest
2 голосов
/ 15 мая 2009

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

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

1 голос
/ 15 мая 2009

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

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

...