2012-04-04 3 views
1

Ich habe eine Basisklasse und eine abgeleitete Klasse (unten beschrieben) und eine einzelne Eigenschaft, "TestProperty". Mein Ziel ist es, den Wert, den ich in testproperty gesetzt habe, innerhalb der initialize-Komponente zu serialisieren. Das ist sehr SCHLÜSSEL, denn zu einem späteren Zeitpunkt muss die Basisklasse zum Entwurfszeitpunkt auf den neuen Wert dieser Eigenschaft zugreifen können, und wenn dieser Wert nicht in initializeComponent festgelegt ist, habe ich keinen Zugriff auf dieses neue Element. " Default-Wert "wenn Sie gut (aber ich glaube nicht, dass das Default-Value-Attribut in diesem Fall relevant ist).Abgeleitete Klasse erzwingende Eigenschaft in initializecomponent geschrieben werden

Im folgenden Fall ist die einzige Möglichkeit, meine Eigenschaft zu serialisieren, wenn ich "abgeleitet" im Designer öffnen und die Eigenschaft manuell auf einen neuen Wert festlegen.

Ich bin besorgt, dass eine benutzerdefinierte codedomserializer wird die Lösung sein, aber ich versuche sehr, das zu vermeiden. Ich möchte, dass "Base" so wenig Code wie möglich hat.

Wie kann ich meine Eigenschaft (setzen, wo ich es bekommen kann, in Code), um in initializecomponent mit der Bearbeitung vom Designer gestaut bekommen?

public partial class Base : Form 
    { 
     public Base() 
     { 
     InitializeComponent(); 
     TestProperty = "set in the base class"; 
     } 
     [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] 
     public string TestProperty 
     { 
     get; 
     set; 
     } 
    } 

Und eine einfache Klasse abgeleitet

public partial class Derived : Base 
    { 
     public Derived() 
     { 
     InitializeComponent(); 
     this.TestProperty = "i want to be packed into initializecomponent somehow"; 
     } 
    } 

Einige weitere Informationen darüber, warum ich zu tun habe versucht, was ich tue.

Mein Problem ist dies, wenn ich im Designer "abgeleitet" geöffnet habe, habe ich eine benutzerdefinierte editorcontrol bieng verwendet, um eine Eigenschaft zu bearbeiten, genannt "editableproperty". EditableProperty benötigt in diesem Fall Zugriff auf TestProperty. Zur Laufzeit ist es kein Problem, ich habe vollen Zugriff auf Abgeleitet als ein Typ, und es ist kein Problem.

Das Problem ist, dass das EditorControl, das ich verwende, in einer anderen Assembly ist, und es (aus welchen Gründen auch immer, weil es in einer anderen Assembly als abgeleitet ist), lädt nicht den neuen Wert, den ich einstelle der Konstruktor von abgeleitet.

Grundsätzlich, wenn ich geöffnet im Designer und versuchen, einen benutzerdefinierten Editor zu verwenden, wird es "in der Basisklasse" als Wert für TestProperty festgelegt. Ich muss TestProperty in initializecomponent gesetzt haben, damit mein editorcontrol den Wert sieht.

+0

Es sollte nicht erforderlich sein, dass dieser Wert direkt in InitializeComponent geschrieben wird, wenn Sie ihn selbst festlegen. Sie sagen, dass Sie keinen Zugriff auf diesen neuen "Standardwert" haben, aber jede Verwendung von Derived (einschließlich der Ableitung anderer Formulare daraus) enthält diesen Wert. Vielleicht, wenn Sie mehr darüber erklären können, was Sie erreichen wollen, wird es mir helfen, Ihnen eine bessere Antwort zu geben. –

+0

Ich (schlecht) bearbeitet die Frage, um hoffentlich zu erklären, was ich versuche zu tun. – greggorob64

Antwort

1

Der Formular-Designer erstellt keine Instanz von Derived; Es erstellt eine Instanz von Base und ruft dann die InitializeComponent-Methode von Derived auf. Aus diesem Grund wird der neue Wert der Eigenschaft, die Sie festlegen, vom Designer nicht übernommen.

Sie müssen den Wert der Eigenschaft nur im Designer für Derived festlegen, anstatt ihn im Konstruktor festzulegen. Dadurch wird der neue Wert der Eigenschaft in InitializeComponent beibehalten und zur Entwurfszeit sichtbar gemacht.

+0

Wenn ich das tun könnte, würde ich. Der springende Punkt der Übung ist, dass ich es aus dem Code machen will. Die Eigenschaft, die ich versuche, in abgeleitet zu setzen, bekomme ich von einer * .settings-Datei in dem Projekt, das abgeleitete enthält. – greggorob64

+0

Nun, das ist anders. Suchen Sie mit dem im Designer ausgewählten Formular im Eigenschaftsfenster nach. Siehe die allererste Zeile "(ApplicationSettings)"? Sie können das verwenden, um eine Bindung zwischen der TestProperty und der Einstellung zu erstellen.Wenn es sich nicht um eine Anwendungseinstellung handelt, können Sie die nächste Zeile "(DataBindings)" verwenden, um eine Bindung zu erstellen (Sie müssen eine Objektdatenquelle erstellen, die auf die stark type-Klasse verweist, die Ihre Einstellungsdatei umschließt). –

+0

Ich werde es versuchen, ich erwarte irgendwie das folgende Problem: Die Basisklasse und meine Editor-Klasse befinden sich in einer Assembly "A" und meine Einstellungsdatei befindet sich in Assembly "B". Wird das ein Problem sein? – greggorob64

Verwandte Themen