private void SettingsViewModelPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            this.SettingDialogStatus = SettingDialogStatus.NotWorking;

            if (e.PropertyName == "ActiveProxy")
            {
                var newActiveProxy = this.proxyService.Proxies.First(x => x.ProxyName == settingsViewModel.ActiveProxy);
                if (newActiveProxy == null)
                {
                    return;
                }

                this.SettingDialogStatus = SettingDialogStatus.InitiatingProxy;
                UpdateCommands();

                var InitializationTask = Task.Factory.StartNew(() =>
                {
                    newActiveProxy.Initialize();
                });

                InitializationTask.ContinueWith(task =>
                {
                    this.SettingDialogStatus = SettingDialogStatus.InitiatingProxyFailed;
                }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());

                InitializationTask.ContinueWith(task =>
                {
                    if (this.settingActiveProxy != null)
                    {
                        RemoveWeakEventListener(this.settingActiveProxy, ActiveProxyPropertyChanged);
                        RemoveWeakEventListener(this.settingActiveProxy.StateValues, StateValuesCollectionChanged);

                        var settingView = this.settingActiveProxy.InitializeSettingDialog();
                        if (settingView != null)
                        {
                            this.views.Remove(settingView);
                        }
                    }

                    this.settingActiveProxy = newActiveProxy;
                    StateValuesCollectionChanged(null, null);

                    if (this.settingActiveProxy != null)
                    {
                        AddWeakEventListener(this.settingActiveProxy, ActiveProxyPropertyChanged);
                        AddWeakEventListener(this.settingActiveProxy.StateValues, StateValuesCollectionChanged);
                        var settingView = this.settingActiveProxy.InitializeSettingDialog();
                        if (settingView != null)
                        {
                            this.views.Add(settingView);
                        }
                    }
                    this.SettingDialogStatus = SettingDialogStatus.NotWorking;
                }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
            }

            UpdateCommands();
        }
        private void SubmitSettingCommand()
        {
            if (this.SettingDialogStatus == SettingDialogStatus.ProxyBusy ||
                this.SettingDialogStatus == SettingDialogStatus.ProxyCannotConnect ||
                this.SettingDialogStatus == SettingDialogStatus.ProxyUnvalid)
            {
                this.settingActiveProxy.AfterCloseSettingDialog(true);
                this.proxyService.ActiveProxy = this.settingActiveProxy;
                Close(true);
            }

            this.SettingDialogStatus = SettingDialogStatus.ValidatingProxySettings;
            UpdateCommands();
            Task.Factory.StartNew(() =>
            {
                return(this.settingActiveProxy.ValidateBeforeCloseSettingDialog());
            })
            .ContinueWith(task =>
            {
                switch (task.Result)
                {
                case SettingDialogValidateionResult.Busy:
                    this.SettingDialogStatus = SettingDialogStatus.ProxyBusy;
                    return(false);

                case SettingDialogValidateionResult.ConnectFailed:
                    this.SettingDialogStatus = SettingDialogStatus.ProxyCannotConnect;
                    return(false);

                case SettingDialogValidateionResult.UnValid:
                    this.SettingDialogStatus = SettingDialogStatus.ProxyUnvalid;
                    return(false);

                case SettingDialogValidateionResult.Valid:
                    this.SettingDialogStatus = SettingDialogStatus.ProxyValid;
                    return(true);
                }
                return(false);
            }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext())
            .ContinueWith(task =>
            {
                if (task.Result)
                {
                    this.settingActiveProxy.AfterCloseSettingDialog(true);
                    this.proxyService.ActiveProxy = this.settingActiveProxy;
                    Close(true);
                }
                else
                {
                    UpdateCommands();
                }
            }, CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
        }
        private void ActiveProxyPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            this.SettingDialogStatus = SettingDialogStatus.NotWorking;

            UpdateCommands();
        }