private void ShowPhraseContextMenu()
        {
            PhraseViewModel phrase = lvwPhrases.SelectedItem as PhraseViewModel;

            if (phrase == null)
            {
                return;
            }

            ContextMenu menu = new ContextMenu();

            MenuItemBuilder builder = new MenuItemBuilder();

            menu.Items.Add(builder.New("Delete").Handler(() => {
                DeletePhrase(phrase);
            }).MenuItem);

            menu.Items.Add(builder.New("Rename").Handler(() => {
                RenamePhrase(phrase);
            }).MenuItem);

            menu.Items.Add(new Separator());

            menu.Items.Add(builder.New("Add new phrase value").Handler(() => {
                AddNewPhraseValue();
            }).MenuItem);

            lvwPhrases.ContextMenu = menu;
        }
        private void AddNewPhraseValue()
        {
            if (CurrentCategory == null)
            {
                return;
            }

            Phrase phrase = new Phrase();

            phrase.PhraseText  = "<New Phrase>";
            phrase.PhraseID    = -1;
            phrase.PhraseCatID = CurrentCategory.CategoryID;

            PhraseViewModel viewModel = new PhraseViewModel(phrase);

            (lvwPhrases.ItemsSource as ObservableCollection <PhraseViewModel>).Add(viewModel);
            viewModel.IsSelected = true;

            lvwPhrases.Dispatcher.BeginInvoke(new Action(() => {
                lvwPhrases.ScrollIntoView(viewModel);
                ListViewItem item = (ListViewItem)lvwPhrases.ItemContainerGenerator.ContainerFromItem(viewModel);
                if (item != null)
                {
                    item.Focus();
                }
            }));

            RegisterPendingChange(new InsertPhraseCommand(phrase));

            viewModel.IsRenaming = true;
        }
        private void RenamePhrase(PhraseViewModel phrase)
        {
            if (phrase == null || phrase.IsDeleted)
            {
                return;
            }

            phrase.IsRenaming = true;
        }
        private void DeletePhrase(PhraseViewModel phrase)
        {
            if (phrase == null || phrase.IsDeleted)
            {
                return;
            }

            if (this.Question(String.Format("Are you sure you want to delete the phrase \"{0}\"?", phrase.PhraseText), "Delete phrase?"))
            {
                RegisterPendingChange(new DeletePhraseCommand(phrase.Model));
                phrase.IsDeleted = true;
            }
        }
        private void PhraseText_EditingCancelled(object sender, string oldtext)
        {
            PhraseViewModel vm = (sender as EditableTextBlock).ViewModel as PhraseViewModel;

            vm.PhraseText = oldtext;
        }
        private void PhraseText_EditingComplete(object sender, string text)
        {
            PhraseViewModel vm = (sender as EditableTextBlock).ViewModel as PhraseViewModel;

            RegisterPendingChange(new RenamePhraseCommand(vm.Model, text));
        }