2009-05-15 36 views
2

(Update) ICustomTypeDescriptor funktioniert für meine Windows Forms App, aber nicht für Silverlight; Nicht unterstützt. Ich werde diese Idee weiter untersuchen und sehen, wo ich hinkomme. (/ update)C# INotifyPropertyChanged für Eigenschaften eines dynamisch erstellten Objekts?

Ich habe, sagen ein paar Schalttafeln (für diejenigen, die Analogien mögen). Jedes dieser Schaltfelder hat Schalter, die einen Namen (String) im Status (bool) von On oder Off haben können. Das Switchpanel und die Switches sind Objekte, auf denen die INotify-Schnittstelle vorhanden ist.

Mithilfe der Schalter Namen, ich eine Liste aller möglichen Switch-Namen über die Sammlung erstellen und erstellen Sie eine dynamische Klasse mit all diesen Namen als Eigenschaften.

SwitchPanel1 (Switches(Switch1 ("Main",On) , Switch2("Slave",Off))) 
SwitchPanel2 (Switches(Switch1 ("Bilge",On) , Switch2("Main",Off))) 

Erzeugt eine Sammlung von

(Main,Bilge,Slave) 

und eine dynamische Klasse erzeugt wird, das die Eigenschaften hat:

SwitchPanel : (SwitchPanel) 
Main : (Switch) 
Bilge : (Switch) 
Slave: (Switch) 

Die Idee ist, dass, wenn die Schalttafel verfügt über einen Schalter mit dem Namen von der Eigenschaft wird es auf dieser Eigenschaft gesetzt. Also mit einem wenig Linq

propeties["Main"].SetValue(newSwitchType,SwitchPanel.Switches.FirstOrDefault(sw => sw.Name == "Main")); 

ich diese neue dynamische Klasse zu INotfyPropertyChanged werfen will und die tatsächlichen Änderungen auf diesen neuen Eigenschaften zu fangen, so dass, wenn ein Schalter ändert das dynamische Objekt angeben, wird es melden.

Warum? Es muss in einer Listenansicht angezeigt werden, und die Listenansicht, die ich verwende, hat ihre Bindung, indem sie den Eigenschaftsnamen und nicht den Bindungspfad angibt.

Es versucht auch, INotify-Ereignisse abzufangen, indem das Objekt gegen INotifyPropertyChanged geworfen wird. Dies bedeutet, dass es sortieren und/oder gruppieren wird, wenn sich die Dinge ändern.

Wenn Sie eine bessere Möglichkeit wissen, lassen Sie es mich wissen. Bitte.

Antwort

1

Sie benötigen wahrscheinlich keine dynamische Klasse. Sie können Laufzeitbindungseigenschaften über ICustomTypeDescriptor/GetProperties() implementieren und Ihre eigene PropertyDescriptor-Implementierung erstellen, die den benannten Schalter zurückgibt. Es ist nicht klar, was zuerst über die Änderung bekannt ist, aber Sie könnten entweder INotifyPropertyChanged oder das ältere eigenschaftsspezifische Änderungsereignis verwenden, das wiederum an jede Eigenschaft gebunden ist (also z. B. an das Ereignis im benannten Schalter).

nicht trivial, aber auch nicht unmöglich.

+0

Wie Sie sagen, nicht trivial, aber auf jeden Fall einfacher als eine dynamische Klasse zu erzeugen ... –

+0

Dies könnte eine interessante Möglichkeit sein, es zu tun, und es ist auf jeden Fall meines Funke Neugier wird es geben und melden Sie sich zurück – Dann

+0

Arbeitete normal, aber nicht mit einem anderen Projekt, weil das in Silverlight ist (wie das nicht unterstützt ICustomTypeDescriptor, grrr). Wird als die Antwort markieren, aber keine Ideen für s ilverlight wäre auch gut. – Dann

Verwandte Themen