Ich hoffe mal, die Frage von Sacaldur ist an mich gerichtet... ich hole mal ein bisschen aus und erkläre den Sinn dieser Klassen bzw. Interfaces:
In meinem Programm kann der Anwender verschiedene Objekte miteinander verknüpfen, damit diese (die Objekte) Werte austauschen. Ein Objekt kann dazu Schnittstellen zur Verfügung stellen - das sind die sogenannten Pins. Es gibt Input- und OutputPins. Dabei wird immer nur vom OutputPin zum InputPin übertragen. InputPins können von beliebig vielen OutputPins einen Wert empfangen, die Werte werden dann abhängig vom Werttyp gemischt. Genauso können OutputPins an mehrere InputPins einen Wert versenden - der wird dann einfach kopiert und allen geschickt.
Ein OutputPin kennt alle seine verknüpften InputPins und andersherum. Wenn ein OutputPin einen Wert in seinen InputPins setzen möchte, dann geht er seine intere Pinliste durch und setzt in diesen Pins überall die Value-Eigenschaft neu. Die Pinklassen sind generisch, damit nur Pins verknüpft werden können, die auch den selben Typ besitzen. Daher die Generic-Klassen in meinem Code oben mit den ObservableCollections als Eigenschaft.
Das Werte Austauschen und Mischen an sich funktioniert wunderbar, nur mit dem Verknüpfen habe ich jetzt Probleme. Zum Testen habe die Pins per Code verknüpft, das war kein Problem, weil ich immer genau wusste was für ein Werttyp das gerade ist. Wenn ich das nun den User machen lassen möchte, brauche ich eine GUI, die mit allen Werttypen klarkommt!
Ich beschreibe mal wie meine bisherige Verknüpfungs-GUI funktioniert: Es wird ein Pin ausgewählt, dann auf "verknüpfen mit..." geklickt und dann öffnet sich ein neues Fenster - die Verknüpfungs-GUI. Diese bekommt den Pin mitgeteilt für den sie aufgerufen wird - da tritt dann das erste Problem auf: Ich habe zwar zwei GUIs - eine für InputPins und eine für OutputPins, aber was mache ich mit den Werttypen - da kann ich unmöglich für alle 20 verschiedenen Werttypen eine eigene GUI schreiben?! Darum habe ich mir das Interface IInputPin bzw. IOutputPin gebaut, damit die GUI eine allgemeine nicht-Generic-Schnittstelle hat, um Pins übergeben zu bekommen.
Hat die GUI einen Pin bekommen, findet sie über das IInputPin bzw. IOutputPin Interface heraus, welchen Typ der GenericParameter (Werttyp) hat und zeigt dann alle Pins an, die auch diesen Typ haben und somit verbunden werden können bzw. schon verbunden sind. Der Benutzer kann dann mit Mausklick die Verknüpfungen ändern und die GUI setzt über die Eigenschaften Inputs bzw. Outputs der Interfaces IInputPin und IOutputPin die verknüpften Pins. Daher die ObservableCollections in den Interfaces oben im Code.
Jetzt hoffe ich mal, dass da einer durchsteigt! Ich hab mir Mühe gegeben dass verständlich aufzuschreiben.
Wenns eine Möglichkeit gibt, dass ich um die Interfaces herumkomme und der GUI eine Generische klasse gebe, dann finde ich das auch gut! Aber bisher habe ich es nicht geschafft WPF von Generic-Klassen zu überzeugen. Damit meine ich sowas:
|
C#-Quelltext
|
1
|
public partial class InputPinConnectDialog<T> : UserControl { }
|