diff --git a/src/Caliburn.Micro.Core/IoC.cs b/src/Caliburn.Micro.Core/IoC.cs index a060db170..229dba15f 100644 --- a/src/Caliburn.Micro.Core/IoC.cs +++ b/src/Caliburn.Micro.Core/IoC.cs @@ -7,8 +7,14 @@ namespace Caliburn.Micro /// /// Used by the framework to pull instances from an IoC container and to inject dependencies into certain existing classes. /// - public static class IoC - { + public static class IoC { + static IoC() { + if (Execute.InDesignMode) { + GetInstance = (service, key) => Activator.CreateInstance(service); + GetAllInstances = service => new[] { Activator.CreateInstance(service) }; + BuildUp = o => { }; + } + } /// /// Gets an instance by type and key. /// diff --git a/src/Caliburn.Micro.Platform.Core/TypeMappingConfiguration.cs b/src/Caliburn.Micro.Platform.Core/TypeMappingConfiguration.cs index 58589a56d..6888e3f0a 100644 --- a/src/Caliburn.Micro.Platform.Core/TypeMappingConfiguration.cs +++ b/src/Caliburn.Micro.Platform.Core/TypeMappingConfiguration.cs @@ -17,6 +17,11 @@ public class TypeMappingConfiguration /// public string DefaultSubNamespaceForViewModels { get; set; } = "ViewModels"; + /// + /// The default subnamespace for DesignViewModels. Used for creating default subnamespace mappings. Defaults to "DesignViewModels". + /// + public string DefaultSubNamespaceForDesignViewModels = "DesignViewModels"; + /// /// Flag to indicate whether or not the name of the Type should be transformed when adding a type mapping. Defaults to true. /// @@ -38,6 +43,12 @@ public class TypeMappingConfiguration /// public List ViewSuffixList { get; set; } = new List(new[] { "View", "Page" }); + /// + /// List of design ViewModels suffixes for which default type mappings should be created. Applies only when UseNameSuffixesInMappings = true. + /// Default values are "ViewModelDesign", "DesignViewModel" + /// + public List DesignViewModelSuffixList = new List(new[] { "ViewModelDesign", "DesignViewModel" }); + /// /// The name suffix for ViewModels. Applies only when UseNameSuffixesInMappings = true. The default is "ViewModel". /// diff --git a/src/Caliburn.Micro.Platform/ViewLocator.cs b/src/Caliburn.Micro.Platform/ViewLocator.cs index c9ce35e6b..71bdfce64 100644 --- a/src/Caliburn.Micro.Platform/ViewLocator.cs +++ b/src/Caliburn.Micro.Platform/ViewLocator.cs @@ -35,6 +35,7 @@ public static class ViewLocator { //These fields are used for configuring the default type mappings. They can be changed using ConfigureTypeMappings(). static string defaultSubNsViews; static string defaultSubNsViewModels; + static string defaultSubNsDesignViewModels; static bool useNameSuffixesInMappings; static string nameFormat; static string viewModelSuffix; @@ -70,6 +71,11 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) { throw new ArgumentException("DefaultSubNamespaceForViewModels field cannot be blank."); } + if (Execute.InDesignMode && String.IsNullOrEmpty(config.DefaultSubNamespaceForDesignViewModels)) + { + throw new ArgumentException("DefaultSubNamespaceForDesignViewModels field cannot be blank."); + } + if (String.IsNullOrEmpty(config.NameFormat)) { throw new ArgumentException("NameFormat field cannot be blank."); } @@ -79,6 +85,7 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) { defaultSubNsViews = config.DefaultSubNamespaceForViews; defaultSubNsViewModels = config.DefaultSubNamespaceForViewModels; + if (Execute.InDesignMode) defaultSubNsDesignViewModels = config.DefaultSubNamespaceForDesignViewModels; nameFormat = config.NameFormat; useNameSuffixesInMappings = config.UseNameSuffixesInMappings; viewModelSuffix = config.ViewModelSuffix; @@ -86,6 +93,12 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) { includeViewSuffixInVmNames = config.IncludeViewSuffixInViewModelNames; SetAllDefaults(); + + if (Execute.InDesignMode) { + foreach (var designSuffix in config.DesignViewModelSuffixList) { + NameTransformer.AddRule($"{designSuffix}$", config.ViewSuffixList); + } + } } @@ -96,6 +109,7 @@ private static void SetAllDefaults() { } else { AddSubNamespaceMapping(defaultSubNsViewModels, defaultSubNsViews); + if (Execute.InDesignMode) AddSubNamespaceMapping(defaultSubNsDesignViewModels, defaultSubNsViews); } } @@ -113,6 +127,9 @@ public static void AddDefaultTypeMapping(string viewSuffix = "View") { //Check for .ViewModels.. construct AddSubNamespaceMapping(defaultSubNsViewModels, defaultSubNsViews, viewSuffix); + + //Check for .DesignViewModels.. construct + if (Execute.InDesignMode) AddSubNamespaceMapping(defaultSubNsDesignViewModels, defaultSubNsViews, viewSuffix); } /// diff --git a/src/Caliburn.Micro.Platform/ViewModelLocator.cs b/src/Caliburn.Micro.Platform/ViewModelLocator.cs index aa697d674..617120fe9 100644 --- a/src/Caliburn.Micro.Platform/ViewModelLocator.cs +++ b/src/Caliburn.Micro.Platform/ViewModelLocator.cs @@ -35,6 +35,7 @@ public static class ViewModelLocator //These fields are used for configuring the default type mappings. They can be changed using ConfigureTypeMappings(). static string defaultSubNsViews; static string defaultSubNsViewModels; + static string defaultSubNsDesignViewModels; static bool useNameSuffixesInMappings; static string nameFormat; static string viewModelSuffix; @@ -85,6 +86,11 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) throw new ArgumentException("DefaultSubNamespaceForViewModels field cannot be blank."); } + if (Execute.InDesignMode && String.IsNullOrEmpty(config.DefaultSubNamespaceForDesignViewModels)) + { + throw new ArgumentException("DefaultSubNamespaceForDesignViewModels field cannot be blank."); + } + if (String.IsNullOrEmpty(config.NameFormat)) { throw new ArgumentException("NameFormat field cannot be blank."); @@ -95,6 +101,7 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) defaultSubNsViews = config.DefaultSubNamespaceForViews; defaultSubNsViewModels = config.DefaultSubNamespaceForViewModels; + defaultSubNsDesignViewModels = config.DefaultSubNamespaceForDesignViewModels; nameFormat = config.NameFormat; useNameSuffixesInMappings = config.UseNameSuffixesInMappings; viewModelSuffix = config.ViewModelSuffix; @@ -114,6 +121,7 @@ private static void SetAllDefaults() else { AddSubNamespaceMapping(defaultSubNsViews, defaultSubNsViewModels); + if (Execute.InDesignMode) AddSubNamespaceMapping(defaultSubNsDesignViewModels, defaultSubNsViews); } } @@ -133,6 +141,10 @@ public static void AddDefaultTypeMapping(string viewSuffix = DefaultViewSuffix) //Check for .Views.. construct AddSubNamespaceMapping(defaultSubNsViews, defaultSubNsViewModels, viewSuffix); + + //Check for .Views.. construct + if (Execute.InDesignMode) AddSubNamespaceMapping(defaultSubNsViews, defaultSubNsDesignViewModels, viewSuffix); + } ///