Does anyone know of some global state variable that is available so that I can check if the code is currently executing in design mode (e.g. in Blend or Visual Studio) or not?
It would look something like this:
//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode)
{
...
}
The reason I need this is: when my application is being shown in design mode in Expression Blend, I want the ViewModel to instead use a "Design Customer class" which has mock data in it that the designer can view in design mode.
However, when the application is actually executing, I of course want the ViewModel to use the real Customer class which returns real data.
Currently I solve this by having the designer, before he works on it, go into the ViewModel and change "ApplicationDevelopmentMode.Executing" to "ApplicationDevelopmentMode.Designing":
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);
}
}
}
I believe you are looking for GetIsInDesignMode, which takes a DependencyObject.
Ie.
Edit: When using Silverlight / WP7, you should use
IsInDesignTool
sinceGetIsInDesignMode
can sometimes return false while in Visual Studio:Edit: And finally, in the interest of completeness, the equivalent in WinRT / Metro / Windows Store applications is
DesignModeEnabled
:When Visual Studio auto generated some code for me it used
Works from anywhere. I use it to stop databound videos from playing in the designer.
I've only tested this with Visual Studio 2013 and .NET 4.5 but it does the trick.
It's possible though that some setting in Visual Studio will change this value to false, if that ever happens we can result to just checking whether this resource name exist. It was
null
when I ran my code outside the designer.The upside of this approach is that it does not require explicit knowledge of the specific
App
class and that it can be used globally throughout your code. Specifically to populate view models with dummy data.I have an idea for you if your class doesn't need an empty constructor.
The idea is to create an empty constructor, then mark it with ObsoleteAttribute. The designer ignores the obsolete attribute, but the compiler will raise an error if you try to use it, so there's no risk of accidentaly using it yourself.
(pardon my visual basic)
And the xaml:
This won't work if you really need the empty constructor for something else.
And if you extensively use Caliburn.Micro for your large WPF / Silverlight / WP8 / WinRT application you could use handy and universal caliburn's
Execute.InDesignMode
static property in your view-models as well (and it works in Blend as good as in Visual Studio):