From 63ee18308b8a077f0375d6ac2fe9185594828fbd Mon Sep 17 00:00:00 2001 From: mmoreira Date: Sat, 12 May 2018 01:55:14 -0300 Subject: [PATCH 1/3] * Fixed a bug that raises an InvalidOperationException("IoC is not initialized.") at Design Time when creating a view that has a child view using content control. The solution was to initialize the IoC container at Design Time with the same methods that are injected by Bootstrapper abstract class. * Added preliminary support to Design Time view models convention. At Design Time, any viewmodel named as {model}ViewModelDesign will be mapped to {model}View. --- src/Caliburn.Micro.Platform/ViewLocator.cs | 4 ++++ src/Caliburn.Micro/IoC.cs | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/Caliburn.Micro.Platform/ViewLocator.cs b/src/Caliburn.Micro.Platform/ViewLocator.cs index 508638ef4..428b21872 100644 --- a/src/Caliburn.Micro.Platform/ViewLocator.cs +++ b/src/Caliburn.Micro.Platform/ViewLocator.cs @@ -86,6 +86,10 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) { includeViewSuffixInVmNames = config.IncludeViewSuffixInViewModelNames; SetAllDefaults(); + + if (Execute.InDesignMode) { + NameTransformer.AddRule("ModelDesign$", string.Empty); + } } diff --git a/src/Caliburn.Micro/IoC.cs b/src/Caliburn.Micro/IoC.cs index 5580c7680..65e724e18 100644 --- a/src/Caliburn.Micro/IoC.cs +++ b/src/Caliburn.Micro/IoC.cs @@ -7,6 +7,13 @@ /// Used by the framework to pull instances from an IoC container and to inject dependencies into certain existing classes. /// 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. /// From 51bcc6e9e0f222d0e8d10826a5be9c97d562de60 Mon Sep 17 00:00:00 2001 From: mmoreira Date: Sat, 12 May 2018 01:55:14 -0300 Subject: [PATCH 2/3] * Fixed a bug that raises an InvalidOperationException("IoC is not initialized.") at Design Time when creating a view that has a child view using content control. The solution was to initialize the IoC container at Design Time with the same methods that are injected by Bootstrapper abstract class. * Added preliminary support to Design Time view models convention. At Design Time, any viewmodel named as {model}ViewModelDesign will be mapped to {model}View. --- src/Caliburn.Micro.Platform/ViewLocator.cs | 4 ++++ src/Caliburn.Micro.sln.DotSettings | 11 ----------- src/Caliburn.Micro/IoC.cs | 7 +++++++ 3 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 src/Caliburn.Micro.sln.DotSettings diff --git a/src/Caliburn.Micro.Platform/ViewLocator.cs b/src/Caliburn.Micro.Platform/ViewLocator.cs index 508638ef4..428b21872 100644 --- a/src/Caliburn.Micro.Platform/ViewLocator.cs +++ b/src/Caliburn.Micro.Platform/ViewLocator.cs @@ -86,6 +86,10 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) { includeViewSuffixInVmNames = config.IncludeViewSuffixInViewModelNames; SetAllDefaults(); + + if (Execute.InDesignMode) { + NameTransformer.AddRule("ModelDesign$", string.Empty); + } } diff --git a/src/Caliburn.Micro.sln.DotSettings b/src/Caliburn.Micro.sln.DotSettings deleted file mode 100644 index d0f94004f..000000000 --- a/src/Caliburn.Micro.sln.DotSettings +++ /dev/null @@ -1,11 +0,0 @@ - - END_OF_LINE - END_OF_LINE - END_OF_LINE - END_OF_LINE - UI - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - True - True - True \ No newline at end of file diff --git a/src/Caliburn.Micro/IoC.cs b/src/Caliburn.Micro/IoC.cs index 5580c7680..65e724e18 100644 --- a/src/Caliburn.Micro/IoC.cs +++ b/src/Caliburn.Micro/IoC.cs @@ -7,6 +7,13 @@ /// Used by the framework to pull instances from an IoC container and to inject dependencies into certain existing classes. /// 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. /// From 183978b916e6bd47e70fc613961b0cab8808a0d0 Mon Sep 17 00:00:00 2001 From: mmoreira Date: Sat, 12 May 2018 03:28:14 -0300 Subject: [PATCH 3/3] Better support for design view models. Design View Models can use namespace convention (Default namespace for design view models is DesignViewModels) and name convention. Default name conventions are {model}DesignViewModel and {model}ViewModelDesign --- .../TypeMappingConfiguration.cs | 11 +++++++++++ src/Caliburn.Micro.Platform/ViewLocator.cs | 15 ++++++++++++++- src/Caliburn.Micro.Platform/ViewModelLocator.cs | 12 ++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/Caliburn.Micro.Platform/TypeMappingConfiguration.cs b/src/Caliburn.Micro.Platform/TypeMappingConfiguration.cs index 7e3435653..90d0025c3 100644 --- a/src/Caliburn.Micro.Platform/TypeMappingConfiguration.cs +++ b/src/Caliburn.Micro.Platform/TypeMappingConfiguration.cs @@ -15,6 +15,11 @@ public class TypeMappingConfiguration { /// public string DefaultSubNamespaceForViewModels = "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. /// @@ -36,6 +41,12 @@ public class TypeMappingConfiguration { /// public List ViewSuffixList = 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 428b21872..3c0767321 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; @@ -88,7 +95,9 @@ public static void ConfigureTypeMappings(TypeMappingConfiguration config) { SetAllDefaults(); if (Execute.InDesignMode) { - NameTransformer.AddRule("ModelDesign$", string.Empty); + foreach (var designSuffix in config.DesignViewModelSuffixList) { + NameTransformer.AddRule($"{designSuffix}$", config.ViewSuffixList); + } } } @@ -100,6 +109,7 @@ private static void SetAllDefaults() { } else { AddSubNamespaceMapping(defaultSubNsViewModels, defaultSubNsViews); + if (Execute.InDesignMode) AddSubNamespaceMapping(defaultSubNsDesignViewModels, defaultSubNsViews); } } @@ -117,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 f9b986719..64e32e39a 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); + } ///