public Wizard(ConnectedServiceProviderContext context)
        {
            this.Context      = context;
            this.UserSettings = UserSettings.Load(context.Logger);

            ConfigODataEndpointViewModel = new ConfigODataEndpointViewModel(this.UserSettings, this);
            AdvancedSettingsViewModel    = new AdvancedSettingsViewModel(this.UserSettings, this);
            FunctionImportsViewModel     = new FunctionImportsViewModel(this.UserSettings, this);

            if (this.Context.IsUpdating)
            {
                // Since ServiceConfigurationV4 is a derived type of ServiceConfiguration. So we can deserialize a ServiceConfiguration into a ServiceConfigurationV4.
                var serviceConfig = this.Context.GetExtendedDesignerData <ServiceConfigurationV4>();
                ConfigODataEndpointViewModel.LanguageOption = serviceConfig.LanguageOption;
                ConfigODataEndpointViewModel.Endpoint       = serviceConfig.Endpoint;
                ConfigODataEndpointViewModel.EdmxVersion    = serviceConfig.EdmxVersion;
                ConfigODataEndpointViewModel.ServiceName    = serviceConfig.ServiceName;
                ConfigODataEndpointViewModel.AcceptAllUntrustedCertificates = serviceConfig.AcceptAllUntrustedCertificates;
                ConfigODataEndpointViewModel.UseWebProxy = serviceConfig.UseWebProxy;
                ConfigODataEndpointViewModel.NetworkCredentialsDomain           = serviceConfig.NetworkCredentialsDomain;
                ConfigODataEndpointViewModel.NetworkCredentialsUserName         = serviceConfig.NetworkCredentialsUserName;
                ConfigODataEndpointViewModel.NetworkCredentialsPassword         = serviceConfig.NetworkCredentialsPassword;
                ConfigODataEndpointViewModel.WebProxyNetworkCredentialsDomain   = serviceConfig.WebProxyNetworkCredentialsDomain;
                ConfigODataEndpointViewModel.WebProxyNetworkCredentialsUserName = serviceConfig.WebProxyNetworkCredentialsUserName;
                ConfigODataEndpointViewModel.WebProxyNetworkCredentialsPassword = serviceConfig.WebProxyNetworkCredentialsPassword;
                ConfigODataEndpointViewModel.UseNetworkCredentials = serviceConfig.UseNetworkCredentials;
                ConfigODataEndpointViewModel.WebProxyUri           = serviceConfig.WebProxyUri;
                if (ConfigODataEndpointViewModel.View is ConfigODataEndpoint configODataEndpoint)
                {
                    configODataEndpoint.IsEnabled = false;
                }

                // The Viewmodel should always be filled otherwise if the wizard is completed without visiting this page  the generated code becomes wrong
                AdvancedSettingsViewModel.GeneratedFileNameEnabled      = false; // advancedSettings.ReferenceFileName.IsEnabled = false;
                AdvancedSettingsViewModel.GeneratedFileNamePrefix       = serviceConfig.GeneratedFileNamePrefix;
                AdvancedSettingsViewModel.UseNamespacePrefix            = serviceConfig.UseNameSpacePrefix;
                AdvancedSettingsViewModel.NamespacePrefix               = serviceConfig.NamespacePrefix;
                AdvancedSettingsViewModel.UseDataServiceCollection      = serviceConfig.UseDataServiceCollection;
                AdvancedSettingsViewModel.UseAsyncDataServiceCollection = serviceConfig.UseAsyncDataServiceCollection;
                AdvancedSettingsViewModel.OperationImportsGenerator     = serviceConfig.OperationImportsGenerator;
                AdvancedSettingsViewModel.SelectOperationImports        = serviceConfig.GenerateOperationImports;
                AdvancedSettingsViewModel.ExcludedOperationImportsNames = serviceConfig.ExcludedOperationImportsNames;

                if (serviceConfig.EdmxVersion == Common.Constants.EdmxVersion4)
                {
                    AdvancedSettingsViewModel.IgnoreUnexpectedElementsAndAttributes =
                        serviceConfig.IgnoreUnexpectedElementsAndAttributes;
                    AdvancedSettingsViewModel.GenerateDynamicPropertiesCollection = serviceConfig.GenerateDynamicPropertiesCollection;
                    AdvancedSettingsViewModel.DynamicPropertiesCollectionName     = serviceConfig.DynamicPropertiesCollectionName;
                    AdvancedSettingsViewModel.EnableNamingAlias    = serviceConfig.EnableNamingAlias;
                    AdvancedSettingsViewModel.IncludeT4File        = serviceConfig.IncludeT4File;
                    AdvancedSettingsViewModel.MakeTypesInternal    = serviceConfig.MakeTypesInternal;
                    AdvancedSettingsViewModel.IncludeT4FileEnabled = true;
                }

                // Restore the advanced settings to UI elements.
                AdvancedSettingsViewModel.PageEntering += (sender, args) =>
                {
                    if (sender is AdvancedSettingsViewModel advancedSettingsViewModel)
                    {
                        if (advancedSettingsViewModel.View is AdvancedSettings advancedSettings)
                        {
                            advancedSettings.ReferenceFileName.IsEnabled            = false;
                            advancedSettingsViewModel.GeneratedFileNamePrefix       = serviceConfig.GeneratedFileNamePrefix;
                            advancedSettingsViewModel.UseNamespacePrefix            = serviceConfig.UseNameSpacePrefix;
                            advancedSettingsViewModel.NamespacePrefix               = serviceConfig.NamespacePrefix;
                            advancedSettingsViewModel.UseDataServiceCollection      = serviceConfig.UseDataServiceCollection;
                            advancedSettingsViewModel.UseAsyncDataServiceCollection = serviceConfig.UseAsyncDataServiceCollection;
                            advancedSettingsViewModel.OperationImportsGenerator     = serviceConfig.OperationImportsGenerator;
                            advancedSettingsViewModel.SelectOperationImports        = serviceConfig.GenerateOperationImports;
                            advancedSettingsViewModel.ExcludedOperationImportsNames = serviceConfig.ExcludedOperationImportsNames;

                            if (serviceConfig.EdmxVersion == Common.Constants.EdmxVersion4)
                            {
                                advancedSettingsViewModel.IgnoreUnexpectedElementsAndAttributes =
                                    serviceConfig.IgnoreUnexpectedElementsAndAttributes;
                                advancedSettingsViewModel.GenerateDynamicPropertiesCollection = serviceConfig.GenerateDynamicPropertiesCollection;
                                advancedSettingsViewModel.DynamicPropertiesCollectionName     = serviceConfig.DynamicPropertiesCollectionName;
                                advancedSettingsViewModel.EnableNamingAlias    = serviceConfig.EnableNamingAlias;
                                advancedSettingsViewModel.IncludeT4File        = serviceConfig.IncludeT4File;
                                advancedSettingsViewModel.MakeTypesInternal    = serviceConfig.MakeTypesInternal;
                                advancedSettingsViewModel.IncludeT4FileEnabled = true;
                                advancedSettings.IncludeT4File.IsEnabled       = true;
                            }

                            if (!advancedSettingsViewModel.SelectOperationImports || UserSettings.LanguageOption != LanguageOption.GenerateCSharpCode)
                            {
                                RemoveOperationImportsSettingsPage();
                            }
                            else
                            {
                                AddOperationImportsSettingsPage();
                            }
                        }
                    }
                };

                FunctionImportsViewModel.FunctionImports       = serviceConfig.FunctionImports ?? new List <FunctionImportModel>();
                FunctionImportsViewModel.OperationImports      = serviceConfig.OperationImports ?? new List <OperationImportModel>();
                FunctionImportsViewModel.FunctionImportsCount  = serviceConfig.FunctionImports?.Count ?? 0;
                FunctionImportsViewModel.OperationImportsCount = serviceConfig.OperationImports?.Count ?? 0;
            }

            AdvancedSettingsViewModel.PageEntering += (sender, args) =>
            {
                if (sender is AdvancedSettingsViewModel advancedSettingsViewModel)
                {
                    advancedSettingsViewModel.IncludeExtensionsT4File           = AdvancedSettingsViewModel.IncludeExtensionsT4File;
                    advancedSettingsViewModel.IncludeExtensionsT4FileVisibility = ConfigODataEndpointViewModel.EdmxVersion != Common.Constants.EdmxVersion4 ? Visibility.Visible : Visibility.Collapsed;
                    advancedSettingsViewModel.OperationImportsGenerator         = AdvancedSettingsViewModel.OperationImportsGenerator;
                    advancedSettingsViewModel.SelectOperationImports            = AdvancedSettingsViewModel.SelectOperationImports;
                    advancedSettingsViewModel.IncludeT4FileEnabled = true;
                    if (!advancedSettingsViewModel.SelectOperationImports || UserSettings.LanguageOption != LanguageOption.GenerateCSharpCode)
                    {
                        RemoveOperationImportsSettingsPage();
                    }
                    else
                    {
                        AddOperationImportsSettingsPage();
                    }
                }
            };

            FunctionImportsViewModel.PageEntering += (sender, args) =>
            {
                if (sender is FunctionImportsViewModel functionImportsViewModel)
                {
                    if (ConfigODataEndpointViewModel.EdmxVersion == Common.Constants.EdmxVersion4 && (FunctionImportsViewModel.OperationImports == null ||
                                                                                                      !FunctionImportsViewModel.OperationImports.Any() ||
                                                                                                      (AdvancedSettingsViewModel.UseNamespacePrefix && FunctionImportsViewModel.OperationImports.Any(fi => fi.Namespace != AdvancedSettingsViewModel.NamespacePrefix)) ||
                                                                                                      FunctionImportsViewModel.OperationImports.Any(fi =>
                                                                                                                                                    !this.UserSettings.Endpoint.Contains(fi.EndpointUri))))
                    {
                        FunctionImportsViewModel.OperationImports = OperationImportsHelper.GetOperationsImports(
                            (this.CreateServiceConfiguration() as ServiceConfigurationV4).GetODataEdmModel(),
                            AdvancedSettingsViewModel.UseNamespacePrefix
                                ? AdvancedSettingsViewModel.NamespacePrefix
                                : null,
                            File.Exists(ConfigODataEndpointViewModel.Endpoint) ? ConfigODataEndpointViewModel.Endpoint : ConfigODataEndpointViewModel.Endpoint.Replace("$metadata", string.Empty));
                        FunctionImportsViewModel.OperationImportsCount = FunctionImportsViewModel.OperationImports?.Count ?? 0;
                    }

                    if (ConfigODataEndpointViewModel.EdmxVersion != Common.Constants.EdmxVersion4 && (FunctionImportsViewModel.FunctionImports == null ||
                                                                                                      !FunctionImportsViewModel.FunctionImports.Any() ||
                                                                                                      (AdvancedSettingsViewModel.UseNamespacePrefix && FunctionImportsViewModel.FunctionImports.Any(fi => fi.Namespace != AdvancedSettingsViewModel.NamespacePrefix)) ||
                                                                                                      FunctionImportsViewModel.FunctionImports.Any(fi =>
                                                                                                                                                   !this.UserSettings.Endpoint.Contains(fi.EndpointUri))))
                    {
                        FunctionImportsViewModel.FunctionImports = FunctionImportsHelper.GetFunctionImports(
                            this.CreateServiceConfiguration().GetDataEdmModel(),
                            AdvancedSettingsViewModel.UseNamespacePrefix
                                ? AdvancedSettingsViewModel.NamespacePrefix
                                : null,
                            File.Exists(ConfigODataEndpointViewModel.Endpoint) ? ConfigODataEndpointViewModel.Endpoint : ConfigODataEndpointViewModel.Endpoint.Replace("$metadata", string.Empty));
                        FunctionImportsViewModel.FunctionImportsCount = FunctionImportsViewModel.FunctionImports?.Count ?? 0;
                    }

                    functionImportsViewModel.FunctionImports       = FunctionImportsViewModel.FunctionImports;
                    functionImportsViewModel.FunctionImportsCount  = functionImportsViewModel.FunctionImports?.Count ?? 0;
                    functionImportsViewModel.OperationImports      = FunctionImportsViewModel.OperationImports;
                    functionImportsViewModel.OperationImportsCount = functionImportsViewModel.OperationImports?.Count ?? 0;
                }
            };

            this.Pages.Add(ConfigODataEndpointViewModel);
            this.Pages.Add(AdvancedSettingsViewModel);
            this.IsFinishEnabled = true;
        }