/// <summary>
		/// Notifies the tool that configuration has completed
		/// </summary>
		public void OnCompleted()
		{
            //var configPage = Pages != null && Pages.Count > 0 ? Pages[0] : null;			
            //if (configPage != null && configPage.Content is FrameworkElement)
            //{
            //    var configViewModel = (configPage.Content as FrameworkElement).DataContext as QueryViewModel;
				if (configViewModel != null)
				{
					// Updates saved configuration.
					if (savedConfiguration == null)
						savedConfiguration = new QueryViewModel(configViewModel);
					else
						savedConfiguration.ApplyChanges(configViewModel);

					// Updates tool DataContext with savedConfiguration.
					if (toolView != null)
					{
						var toolViewModel = toolView.DataContext as QueryViewModel;
						if (toolViewModel == null)
						{
							toolViewModel = savedConfiguration != null ? new QueryViewModel(savedConfiguration) : new QueryViewModel();
							toolView.DataContext = toolViewModel;
						}
						else if (savedConfiguration != null)
							toolViewModel.ApplyChanges(savedConfiguration);
						// Updates default/selection on each query expression.
						toolViewModel.ResetExpressions();
					}
                }
            //}
		}
		/// <summary>
		/// Initializes the query tool based on a configuration string
		/// </summary>
		/// <param name="configData"></param>
		public void LoadConfiguration(string configData)
		{
			if (!string.IsNullOrEmpty(configData))
			{
				using (MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(configData)))
				{
					DataContractSerializer xmlSerializer = new DataContractSerializer(typeof(QueryViewModel));
					memoryStream.Position = 0;
					savedConfiguration = (QueryViewModel)xmlSerializer.ReadObject(memoryStream);
					memoryStream.Close();
				}
			}
		}
 public void SaveState()
 {
     savedState = new QueryViewModel();
     savedState.ApplyChanges(this);
 }
		/// <summary>
		/// Updates properties of current object with properties of source object.
		/// </summary>
		/// <param name="source"></param>
		public void ApplyChanges(QueryViewModel source)
		{
			CopyAllSettings(source);
		}
		/// <summary>
		/// Copy constructor for the QueryViewModel object.
		/// </summary>
		/// <param name="source"></param>
		public QueryViewModel(QueryViewModel source)
		{			
			CopyAllSettings(source);
		}
		/// <summary>
		/// Updates serializable properties with values from another QueryViewModel.
		/// </summary>
		/// <param name="source">The source QueryViewModel.</param>
		private void CopyAllSettings(QueryViewModel source)
		{
			if (source == null) return;
			enableReset = false;
			ServiceUrl = source.ServiceUrl;
			UseProxy = source.UseProxy;
			enableReset = true;
			IsConnected = source.IsConnected;
			QueryTitle = source.QueryTitle;

            ObservableCollection<ExpressionViewModel> expressions = new ObservableCollection<ExpressionViewModel>();
            if (source.QueryExpressions != null)
            {
                foreach (ExpressionViewModel e in source.queryExpressions)
                {
                    ExpressionViewModel newExp = e.Clone();
                    expressions.Add(newExp);
                }
            }
            QueryExpressions = expressions;
			OutFields = source.OutFields != null ?
				new ObservableCollection<OutField>(from o in source.OutFields select o.Clone()) :
				new ObservableCollection<OutField>();
			AutoEnableDataGrid = source.AutoEnableDataGrid;
			AutoPinResults = source.AutoPinResults;
			AutoZoomToResults = source.AutoZoomToResults;
			UseServiceRenderer = source.UseServiceRenderer;
		}