public async Task SaveAnswer()
        {
            AnswerIsReadOnly          = true;
            SaveAnswerButtonIsEnabled = false;

            #region Thinking (try..)
            var targetId = Guid.NewGuid();
            History.Events.ThinkingAboutTargetEvent.Publish(targetId);
            DisableNavigationRequestedEventMessage.Publish();
            try
            {
                #endregion
                #region Get the DB version of answer, then modify it and save

                //STORE OUR MODIFIED TEXT
                _ModifiedAnswerText = Answer.Text;

                //PREPARE ANSWER TO BE SEARCHED FOR IN DB
                Answer.Text = _InitialAnswerText;
                PhrasesByTextAndLanguageRetriever retriever = null;
                #region SEARCH IN DB FOR ANSWER (WITH INITIAL TEXT)
                History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty);
                {
                    retriever = await Business.PhrasesByTextAndLanguageRetriever.CreateNewAsync(Answer);
                }
                History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty);

                var dbAnswer = retriever.RetrievedSinglePhrase;
                if (dbAnswer == null)
                {
                    //ANSWER NOT IN DB, BUT ANSWER IS A CHILD
                    if (Answer.IsChild)
                    {
                        //CANNOT SAVE THE ANSWER DIRECTLY BECAUSE IT IS A CHILD
                        #region CREATE NEW PHRASE EDIT, LOAD FROM ANSWER DTO, SAVE ANSWER
                        var newAnswerObj = await PhraseEdit.NewPhraseEditAsync();

                        Answer.Text = _ModifiedAnswerText;
                        var dto = Answer.CreateDto();
                        dto.Id = Guid.NewGuid();

                        newAnswerObj.LoadFromDtoBypassPropertyChecks(dto);
                        Answer = newAnswerObj;

                        #region Save Answer
                        Answer = await Answer.SaveAsync();

                        _InitialAnswerText        = Answer.Text;
                        _ModifiedAnswerText       = "";
                        SaveAnswerButtonIsEnabled = true;
                        AnswerIsReadOnly          = true;
                        UpdateEditAnswerButtonVisibilities();
                        #endregion
                        #endregion
                    }
                    //ANSWER NOT IN DB, BUT ANSWER IS NOT A CHILD
                    else
                    {
                        #region SAVE THE ANSWER DIRECTLY, B/C IT IS NOT A CHILD
                        Answer = await Answer.SaveAsync();

                        _InitialAnswerText        = Answer.Text;
                        _ModifiedAnswerText       = "";
                        SaveAnswerButtonIsEnabled = true;
                        AnswerIsReadOnly          = true;
                        UpdateEditAnswerButtonVisibilities();
                        #endregion
                    }
                }
                //ANSWER WAS FOUND IN DB
                else
                {
                    #region REASSIGN THE ANSWER WITH THE DBANSWER, SAVE WITH THE MODIFIED TEXT
                    Answer      = dbAnswer;
                    Answer.Text = _ModifiedAnswerText;
                    Answer      = await Answer.SaveAsync();

                    _InitialAnswerText        = Answer.Text;
                    _ModifiedAnswerText       = "";
                    SaveAnswerButtonIsEnabled = true;
                    AnswerIsReadOnly          = true;
                    UpdateEditAnswerButtonVisibilities();
                    #endregion
                }

                #endregion

                #endregion
                #region (...finally) Thinked
            }
            finally
            {
                EnableNavigationRequestedEventMessage.Publish();
                History.Events.ThinkedAboutTargetEvent.Publish(targetId);
            }
            #endregion
        }
        /// <summary>
        /// Gets the most recent phrase beliefs for all of the current user's phrases.
        /// </summary>
        /// <returns></returns>
        private async Task <PhraseEdit> GetRandomUnknownPhrase(MultiLineTextList multiLineTextList)
        {
            History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty);

            if (_MostRecentPhraseBeliefsCache == null)
            {
                throw new Exception("MostRecentPhraseBeliefsCache should not be null");
            }
            if (_PseudoBeliefsCache == null)
            {
                _PseudoBeliefsCache = new MobileDictionary <string, Tuple <string, double> >();
            }

            PhraseEdit retPhrase = null;

            //GET OUR UNKNOWNS OUT OF OUR CACHES
            var threshold = double.Parse(StudyResources.DefaultKnowledgeThreshold);
            var unknownBeliefsFromCache = (from belief in _MostRecentPhraseBeliefsCache
                                           where belief.Strength < threshold &&
                                           PhraseTextIsInMultiLineTextList(belief.Phrase.Text, multiLineTextList)
                                           select belief).ToList();
            var unknownPseudoBeliefsFromCache = (from entry in _PseudoBeliefsCache
                                                 where entry.Value.Item2 < threshold &&
                                                 PhraseTextIsInMultiLineTextList(entry.Key, multiLineTextList)
                                                 select entry).ToList();

            //GET OUR UNKNOWN PHRASES THAT DONT HAVE A BELIEF OR PSUEDO BELIEF REGISTERED WITH THEM YET
            var unregisteredUnknownPhrases = GetUnregisteredUnknownPhraseBeliefs(multiLineTextList,
                                                                                 unknownBeliefsFromCache,
                                                                                 unknownPseudoBeliefsFromCache);

            var indexToPick = -1;
            //TOTAL COUNT = MOST RECENT PHRASE BELIEFS + PSEUDO BELIEFS COUNT + PHRASES WITHOUT BELIEFS
            var totalCountUnknown = 0;

            totalCountUnknown += unknownBeliefsFromCache.Count;
            if (_PseudoBeliefsCache != null)
            {
                totalCountUnknown += unknownPseudoBeliefsFromCache.Count;
            }
            totalCountUnknown += unregisteredUnknownPhrases.Count;

            if (totalCountUnknown == 0)
            {
                //EVERYTHING IS KNOWN, SO RETURN NULL
                return(null);
            }

            //IF WE TRY TO PICK FROM THE PSEUDO CACHE, THEN IT IS POSSIBLE
            //THAT OUR PHRASETEXT NO LONGER MATCHES A PHRASE. THEREFORE, WE
            //SET UP A LOOP TO KEEP TRYING TO PICK A RANDOM PHRASE FROM THE
            //ENTIRE LIST OF BOTH CACHES. IF WE FAIL TO DO THIS, THEN WE WILL
            //PICK FROM JUST THE ACTUAL BELIEF CACHE (NOT THE PSEUDO).
            var maxTries = int.Parse(StudyResources.MaxTriesToPickRandomFromEntireList);

            for (int i = 0; i < maxTries; i++)
            {
                History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty);

                indexToPick = RandomPicker.Ton.NextInt(0, totalCountUnknown);

                if (indexToPick < unknownBeliefsFromCache.Count)
                {
                    //WE PICK FROM THE PHRASE BELIEF CACHE
                    var belief = unknownBeliefsFromCache[indexToPick];
                    return(belief.Phrase);
                }
                else if (indexToPick < (unknownBeliefsFromCache.Count + unknownPseudoBeliefsFromCache.Count))
                {
                    //WE _TRY_ TO PICK FROM THE PSUEDO CACHE
                    indexToPick -= unknownBeliefsFromCache.Count;
                    var beliefEntry  = unknownPseudoBeliefsFromCache[indexToPick];
                    var phraseText   = beliefEntry.Key;
                    var languageText = beliefEntry.Value.Item1;
                    var phrase       = await PhraseEdit.NewPhraseEditAsync(languageText);

                    phrase.Text = phraseText;
                    var phraseId = Guid.NewGuid();
                    phrase.Id = phraseId;
                    var retriever = await PhrasesByTextAndLanguageRetriever.CreateNewAsync(phrase);

                    retPhrase = retriever.RetrievedSinglePhrase;
                    if (retPhrase != null)
                    {
                        //WE HAVE FOUND A RETURN PHRASE, SO BREAK OUT OF OUR ATTEMPT LOOP
                        return(retPhrase);
                    }
                }
                else
                {
                    //WE PICK FROM THE UNKNOWN PHRASES WITHOUT BELIEFS I'M CONVERTING THIS
                    //TO LIST THIS LATE BECAUSE WE DON'T NEED IT AS A LIST UNTIL NOW.
                    var asList = unregisteredUnknownPhrases.ToList();
                    indexToPick -= (unknownBeliefsFromCache.Count + unknownPseudoBeliefsFromCache.Count);
                    retPhrase    = unregisteredUnknownPhrases[indexToPick];
                    return(retPhrase);
                }
            }

            //IF WE'VE GOTTEN THIS FAR, THEN WE COULDN'T FIND AN UNKNOWN PHRASE
            Services.PublishMessageEvent("Couldn't retrieve unknown phrase.", MessagePriority.Medium, MessageType.Warning);
            return(null);
        }
        public async Task SaveQuestion()
        {
            QuestionIsReadOnly          = true;
            SaveQuestionButtonIsEnabled = false;
            #region Thinking (try..)
            var targetId = Guid.NewGuid();
            History.Events.ThinkingAboutTargetEvent.Publish(targetId);
            DisableNavigationRequestedEventMessage.Publish();
            try
            {
                #endregion

                #region Get the DB version of question, then modify it and save

                //STORE OUR MODIFIED TEXT
                _ModifiedQuestionText = Question.Text;

                //PREPARE QUESTION TO BE SEARCHED FOR IN DB
                Question.Text = _InitialQuestionText;

                #region SEARCH IN DB FOR QUESTION (WITH INITIAL TEXT)
                PhrasesByTextAndLanguageRetriever retriever = null;
                History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty);
                {
                    retriever = await Business.PhrasesByTextAndLanguageRetriever.CreateNewAsync(Question);
                }
                History.Events.ThinkingAboutTargetEvent.Publish(System.Guid.Empty);

                var dbQuestion = retriever.RetrievedSinglePhrase;
                if (dbQuestion == null)
                {
                    //QUESTION NOT IN DB, BUT QUESTION IS A CHILD
                    if (Question.IsChild)
                    {
                        //CANNOT SAVE THE QUESTION DIRECTLY BECAUSE IT IS A CHILD
                        #region CREATE NEW PHRASE EDIT, LOAD FROM QUESTION DTO, SAVE QUESTION
                        var newQuestionObj = await PhraseEdit.NewPhraseEditAsync();

                        Question.Text = _ModifiedQuestionText;
                        var dto = Question.CreateDto();
                        dto.Id = Guid.NewGuid();

                        newQuestionObj.LoadFromDtoBypassPropertyChecks(dto);
                        Question = newQuestionObj;

                        #region Save Question
                        Question = await Question.SaveAsync();

                        _InitialQuestionText        = Question.Text;
                        _ModifiedQuestionText       = "";
                        SaveQuestionButtonIsEnabled = true;
                        QuestionIsReadOnly          = true;
                        UpdateEditQuestionButtonVisibilities();
                        #endregion
                        #endregion
                    }
                    //QUESTION NOT IN DB, BUT QUESTION IS NOT A CHILD
                    else
                    {
                        #region SAVE THE QUESTION DIRECTLY, B/C IT IS NOT A CHILD
                        Question = await Question.SaveAsync();

                        _InitialQuestionText        = Question.Text;
                        _ModifiedQuestionText       = "";
                        SaveQuestionButtonIsEnabled = true;
                        QuestionIsReadOnly          = true;
                        UpdateEditQuestionButtonVisibilities();
                        #endregion
                    }
                }
                //QUESTION WAS FOUND IN DB
                else
                {
                    #region REASSIGN THE QUESTION WITH THE DBQUESTION, SAVE WITH THE MODIFIED TEXT
                    Question      = dbQuestion;
                    Question.Text = _ModifiedQuestionText;
                    Question      = await Question.SaveAsync();

                    _InitialQuestionText        = Question.Text;
                    _ModifiedQuestionText       = "";
                    SaveQuestionButtonIsEnabled = true;
                    QuestionIsReadOnly          = true;
                    UpdateEditQuestionButtonVisibilities();
                    #endregion
                }

                #endregion

                #endregion
                #region (...finally) Thinked
            }
            finally
            {
                EnableNavigationRequestedEventMessage.Publish();
                History.Events.ThinkedAboutTargetEvent.Publish(targetId);
            }
            #endregion
        }