2016-06-24 3 views
2

Der WPF-Designer hat eine schwierige Aufgabe zu erledigen. Um Ihnen eine Lebensansicht Ihres Bildschirms oder Ihrer Komponente zu zeigen, muss Code ausgeführt werden. Da Sie den Designer jedoch nicht steuern, müssen Sie dies tun, ohne irgendwelche Nebenwirkungen zu erzeugen.Wie instanziiert und begrenzt der VS Wpf Designer die Ausführung des VIewModel-Codes?

Also, wie geht das? Welche Regeln gelten für die Ausführung?

  • Was passiert, wenn der Code-Behind-Code der Ansicht die Protokollierung in eine Datei oder einen Dienst ausführt?
  • Was passiert, wenn der Code-Behind MessageBox.Show ruft?
  • Was passiert, wenn der Code-Behind keinen leeren Standardkonstruktor hat?
  • Ich habe vor schlagen Situationen, in denen ich hatte ein Standard-Konstruktor, GetIsInDesignMode und das Erstellen und Zuweisen ein DataContext wenn falsch und noch der Designer nicht richtig Rendering wurde überprüft. Gibt es eine Art Stapeltiefe?

Was sind die Einschränkungen?

Antwort

0

Dies beantwortet nicht genau Ihre Frage, aber um ehrlich zu sein "wie es funktioniert" ist keine sehr spezifische Frage.

Aber anstatt diesen Check-in in Ihren Code-behind fallen lassen, wissen Sie, dass Sie so etwas zu Ihrem Xaml hinzufügen können?

d:DataContext="{Binding Source={d:DesignInstance Type=namespace:className, IsDesignTimeCreatable=True}}" 

Dies bedeutet, dass Sie eine Entwurfszeitversion Ihrer Klasse erstellen können, z. CalculatorDesign: ICalculator, verweisen Sie darauf, dass in Xaml und jedes Mal, wenn Sie die Entwurfszeitklasse ändern und kompilieren, die Ansicht innerhalb von VS ohne Ausführen von Code oder mit komplizierter Logik in Code-Behind aktualisiert wird.

+0

Ich bin mir dessen bewusst, und ich benutze es, um das gesamte ViewModel zur Designzeit zu ersetzen, da ich einige spezifische Fragen in der Frage gestellt habe und keine davon beantwortet habe. Ich denke, das sollte eher ein Kommentar sein eine Antwort, aber Punkt genommen - ich werde die Frage umschreiben, um direkter zu sein. –

2

es diese Nebenwirkungen ohne Herstellung

Nein zu tun hat, ist der Designer nicht, dass smart. Wenn IsDesignTimeCreatable angegeben ist, wird Code in einem öffentlichen parameterlosen Konstruktor und in Eigenschaften ausgeführt, auf die durch Bindungen zugegriffen wird. Genauer gesagt, es werden Meldungsfenster geöffnet, in Dateien geschrieben usw. - oder Ausnahmen versuchen (versuche es einfach selbst).

Wenn Sie keinen öffentlichen parameterlosen Konstruktor haben, kann er keine Instanz erstellen, sodass kein Code ausgeführt wird.

In Bezug auf Ihre Frage zu "Stack Tiefenbegrenzung" kenne ich keine solche Beschränkung. Wenn Sie einen bestimmten Fall haben, in dem es nicht funktioniert, schlage ich vor, dass Sie eine spezielle Frage zu diesem Fall stellen.

In den meisten Fällen, in denen der Designer fehlschlägt, handelt es sich um eine Ausnahme oder andere nicht datenbezogene Probleme (z. B. fehlende Entwurfszeitressourcen). Sie sollten Code, den Sie während der Entwurfszeit nicht verwenden möchten, mit DesignerProperties.GetIsInDesignMode schützen (normalerweise füge ich dem Basisansichtsmodell eine Eigenschaft IsInDesignMode hinzu).

Verwandte Themen