private async Task SaveAsync(Object argument)
        {
            var canSaveResult = this.CanSave();

            if (canSaveResult != null && canSaveResult.Length > 0)
            {
                var translateExtension = new Citizen.Extensions.TranslateExtension();
                translateExtension.Text = canSaveResult.Length == 1 ? "Is" : "Are";
                var verb = translateExtension.ProvideValue(null) as string;

                var dialogService = Xamarin.Forms.DependencyService.Get <IDialogService>();
                await dialogService.AlertInfo("Error", "SavingRequirement", String.Join(",", canSaveResult), verb);

                return;
            }

            this.State = ViewStatesHelper.MoveToState(this.State, ViewStates.Saving);
            var permanentlySaved = this.OnSaving();

            var storeService = Xamarin.Forms.DependencyService.Get <IDataStoreService>();

            storeService.SaveTemporarily <T>(CurrentItem);

            this.State = ViewStatesHelper.MoveToState(this.State, ViewStates.Viewing);

            if (this.InitialState == ViewStates.Viewing && permanentlySaved == false)
            {
                this._initialState = ViewStatesHelper.MoveToState(this.InitialState, ViewStates.Updating, this.InitialState);
            }

            RefreshParentContainer();
        }
        private ViewStates _tempState;  // used exclusively by editAsync and CancelAsync to reset state to previous state.
        private void EditAsync(Object argument)
        {
            _tempState = this.State;
            this.State = ViewStatesHelper.MoveToState(this.State, ViewStates.Updating);

            if (this.InitialState != ViewStates.Creating)
            {
                this.RaisePropertyChanged(nameof(this.State));
            }

            this._refreshAction();
        }
        private async Task DeleteItemsAsync()
        {
            LoggingService.Debug($"{LoggingPrefix}DeleteItemsAsync() - Start ");

            var selectedItemViewModelsList = SelectedItemViewModels.ToList();

            var deletionCount = selectedItemViewModelsList.Count;

            if (deletionCount < 1)
            {
                return;
            }

            var dialogService       = Xamarin.Forms.DependencyService.Get <IDialogService>();
            var deleteStringContent = deletionCount > 1 ? $"{deletionCount}" : selectedItemViewModelsList.First().GetModelDisplayString(selectedItemViewModelsList.First().CurrentItem);
            var answer = await dialogService.ConfirmDeletion(deleteStringContent, deletionCount == 1);

            if (answer != true)
            {
                return;
            }

            await Task.Delay(100);

            lock (this.syncObj)
            {
                foreach (var viewModel in selectedItemViewModelsList)
                {
                    var state    = viewModel.InitialState;
                    var newState = ViewStatesHelper.MoveToState(viewModel.State, ViewStates.Deleting);
                    LoggingService.Debug($"{LoggingPrefix}DeleteItemsAsync() - InitialState: {state}; newState: {newState}. ");
                    LoggingService.Debug($"{LoggingPrefix}DeleteItemsAsync() -  Removing from selectedItemViewModels");

                    if (state != ViewStates.Creating && state != ViewStates.UpdatingCreate)
                    {
                        LoggingService.Debug($"{LoggingPrefix}DeleteItemsAsync() - this is an existing item. continuing. ");
                        viewModel.IsSelected = false;
                        viewModel.State      = newState;
                        continue;
                    }

                    LoggingService.Debug($"{LoggingPrefix}DeleteItemsAsync() - newly created item. can be easely discarded.. Removing from ItemViewModels. ");
                    ItemViewModels.Remove(viewModel);
                }

                LoggingService.Debug($"{LoggingPrefix}DeleteItemsAsync() - End ");
                this.RaisePropertyChanged(nameof(WrappedItemViewModels));
            }
        }
        private async Task DeleteAsync(Object argument)
        {
            var canDeleteResult = this.CanDelete();

            if (canDeleteResult != null && canDeleteResult.Length > 0)
            {
                var dialogDeleteService = Xamarin.Forms.DependencyService.Get <IDialogService>();
                await dialogDeleteService.AlertInfo("Error", "DeleteRequirement", String.Join(",", canDeleteResult));

                return;
            }

            var dialogService = Xamarin.Forms.DependencyService.Get <IDialogService>();
            var answer        = await dialogService.ConfirmDeletion(this.GetModelDisplayString(this.CurrentItem), true);

            if (answer != true)
            {
                return;
            }

            this.State = ViewStatesHelper.MoveToState(this.State, ViewStates.Deleting);
            this._refreshAction();
        }