Kennt jemand eine globale Statusvariable, die verfügbar ist, damit ich überprüfen kann, ob der Code derzeit im Entwurfsmodus ausgeführt wird (z. B. in Blend oder Visual Studio) oder nicht?
Es würde ungefähr so aussehen:
//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode)
{
...
}
Der Grund, warum ich dies benötige, ist: Wenn meine Anwendung in Expression Blend im Entwurfsmodus angezeigt wird, möchte ich, dass das ViewModel stattdessen eine "Design-Kundenklasse" verwendet, die Scheindaten enthält, die der Designer im Entwurfsmodus anzeigen kann.
Wenn die Anwendung jedoch tatsächlich ausgeführt wird, möchte ich natürlich, dass das ViewModel die echte Kundenklasse verwendet, die echte Daten zurückgibt.
Derzeit löse ich dieses Problem, indem der Designer, bevor er daran arbeitet, das ViewModel aufruft und "ApplicationDevelopmentMode.Executing" in "ApplicationDevelopmentMode.Designing" ändert:
public CustomersViewModel()
{
_currentApplicationDevelopmentMode = ApplicationDevelopmentMode.Designing;
}
public ObservableCollection<Customer> GetAll
{
get
{
try
{
if (_currentApplicationDevelopmentMode == ApplicationDevelopmentMode.Developing)
{
return Customer.GetAll;
}
else
{
return CustomerDesign.GetAll;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
quelle
Enable project code
muss der Schalter aktiviert sein (oder Menü-> Design-> 🗹 Projektcode ausführen).Sie können so etwas tun:
quelle
internal class MyDependencyObject : DependencyObject {}
und verwendennew MyDependencyObject
stattDependencyObject
DependencyObject
's Konstruktor istpublic
.Funktioniert von überall. Ich verwende es, um zu verhindern, dass datengebundene Videos im Designer abgespielt werden.
quelle
Application.Current.MainWindow == null
obwohl mir der Typprüfung besser und direkter gefällt. Es sieht auch so aus, als ob der in Visual Studio gehostete Designer Ressourcen hinzufügt. Hier ist eine andere Möglichkeit, dies zu tun (wenn Sie keinen Zugriff auf den bestimmtenApp
Typ in der Bibliothek haben, in der sich Ihr Code befindet)((bool)Application.Current.Resources["ExpressionUseLayoutRounding"])
. Sie müssen überprüfen, ob die Ressource zwar nicht vorhanden ist, aber im Designerkontext funktioniert.Als Visual Studio automatisch Code für mich generierte, wurde dieser verwendet
quelle
Es gibt andere (möglicherweise neuere) Möglichkeiten, Entwurfszeitdaten in WPF anzugeben, wie in dieser Antwort erwähnt .
Im Wesentlichen können Sie Entwurfszeitdaten mithilfe einer Entwurfszeitinstanz Ihres ViewModel angeben :
oder durch Angabe von Beispieldaten in einer XAML-Datei :
Sie müssen die
SamplePage.xaml
Dateieigenschaften auf Folgendes einstellen :Ich platziere diese
UserControl
wie folgt in meinem Tag:Zur Laufzeit verschwinden alle "d:" - Entwurfszeit-Tags, sodass Sie nur Ihren Laufzeitdatenkontext erhalten, unabhängig davon, wie Sie ihn festlegen.
Bearbeiten Möglicherweise benötigen Sie auch diese Zeilen (ich bin nicht sicher, aber sie scheinen relevant zu sein):
quelle
Und wenn Sie ausgiebig nutzen Caliburn.Micro für Ihre große WPF / Silverlight / WP8 / WinRT Anwendung könnten Sie praktisch und verwenden universelle Caliburn der
Execute.InDesignMode
statische Eigenschaft in der Ansicht-Modellen als auch (und es funktioniert in Mischung so gut wie in Visual Studio):quelle
Ich habe dies nur mit Visual Studio 2013 und .NET 4.5 getestet, aber es macht den Trick.
Es ist jedoch möglich, dass einige Einstellungen in Visual Studio diesen Wert in false ändern. In diesem Fall können wir nur prüfen, ob dieser Ressourcenname vorhanden ist. Es war,
null
als ich meinen Code außerhalb des Designers ausführte.Der Vorteil dieses Ansatzes besteht darin, dass keine expliziten Kenntnisse der jeweiligen
App
Klasse erforderlich sind und dass er global in Ihrem Code verwendet werden kann. Speziell zum Auffüllen von Ansichtsmodellen mit Dummy-Daten.quelle
Akzeptierte Antwort hat bei mir nicht funktioniert (VS2019).
Nachdem ich mir angesehen hatte, was los war, kam ich auf Folgendes:
quelle
#if DEBUG
else-Rückgabe false eingeschlossen. Gibt es einen Grund, das nicht zu tun?Ich habe eine Idee für Sie, wenn Ihre Klasse keinen leeren Konstruktor benötigt.
Die Idee ist, einen leeren Konstruktor zu erstellen und ihn dann mit ObsoleteAttribute zu markieren. Der Designer ignoriert das veraltete Attribut, aber der Compiler gibt einen Fehler aus, wenn Sie versuchen, es zu verwenden, sodass kein Risiko besteht, dass Sie es versehentlich selbst verwenden.
( verzeihen Sie meine visuelle Basis )
Und das xaml:
Dies funktioniert nicht, wenn Sie den leeren Konstruktor wirklich für etwas anderes benötigen.
quelle