2009-05-15 4 views
2

(обновление) ICustomTypeDescriptor работает для моего приложения Windows Forms, но не для Silverlight; Не поддерживается. Я продолжу расследование этой идеи и посмотрю, куда я могу добраться. (/ update)C# INotifyPropertyChanged по свойствам динамически созданного объекта?

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

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

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

+0

Как вы говорите, не тривиальны, но, безусловно, проще, чем создание динамического класса ... –

+0

Это может быть интересным способом сделать это, и это, безусловно, искрение моего – Dann

+0

Работал нормально, но не с другим проектом, потому что это в Silverlight (так как это не поддерживает ICustomTypeDescriptor, grrr). Отметьте как ответ, но любые идеи для s ilverlight тоже будет хорошо. – Dann

Смежные вопросы