public void OnAppearing() { if (SelectionHost?.IsAvailable == true) { DrinkIngredients.Add(SelectionHost.Selection); } }
protected bool IsDrinkValid(out StringBuilder msgBuilder) { msgBuilder = new StringBuilder(); if (string.IsNullOrWhiteSpace(DrinkName) || DrinkName.Length < 5 || DrinkName.Length > 250) { msgBuilder.Append("'Drink name' has to have at least 5 and a maximum of 250 characters! \n"); } if (DrinkIngredients.Any(d => d.Milliliter < 15 || d.Milliliter > 500)) { msgBuilder.Append("'Milliliter' has to be between 15 and 500"); } return(msgBuilder.Length == 0); }
public EditDrinkRecipePageViewModel( IUserInteraction userInteraction, IDrinkRecipeBuilder drinkRecipeBuilder, INavigationService navigationService, IDrinkRecipesRepository drinkRecipesRepository, ICrossMediaService crossMediaService, ISelectionHost <DrinkIngredientViewModel> selectionHost, DrinkRecipeViewModel drinkRecipeViewModel) : base(userInteraction, navigationService, drinkRecipeBuilder, crossMediaService, selectionHost) { _userInteraction = userInteraction; _drinkRecipeBuilder = drinkRecipeBuilder; _drinkRecipesRepository = drinkRecipesRepository; _drinkIngredient = drinkRecipeViewModel; DrinkName = drinkRecipeViewModel.Name; ByteImage = drinkRecipeViewModel.ByteImage; DrinkIngredients.AddRange(drinkRecipeViewModel.IngredientViewModels); }
protected ConfigureDrinkRecipePageViewModelBase( IUserInteraction userInteraction, INavigationService navigationService, IDrinkRecipeBuilder drinkRecipeBuilder, ICrossMediaService crossMediaService, ISelectionHost <DrinkIngredientViewModel> selectionHost) { _userInteraction = userInteraction; _navigationService = navigationService; SelectionHost = selectionHost; var addIngredientCanExecute = this.WhenAnyValue(vm => vm.DrinkIngredients.Count, i => i < 6); addIngredientCanExecute .Where(canExecute => !canExecute) .SubscribeAsync(async() => await _userInteraction.DisplayAlertAsync("Info", "Cannot have more then 6 ingredients", "Ok")); var alreadySelectedParameter = new TypedParameter(typeof(IEnumerable <DrinkIngredientViewModel>), DrinkIngredients); AddIngredientCommand = ReactiveCommand.CreateFromTask(async _ => await _navigationService.PushAsync <SelectIngredientsPageViewModel>(alreadySelectedParameter), addIngredientCanExecute); AbortCommand = ReactiveCommand.CreateFromTask(async _ => await _navigationService.PopAsync()); var completedCommandCanExecute = DrinkIngredients.CountChanged .Select(count => count != 0); completedCommandCanExecute .Where(hasIngredients => !hasIngredients) .Skip(1) .Select(async _ => await _userInteraction.DisplayAlertAsync("Warning", "Add ingredients or abort the process!", "ok")) .Subscribe(_ => {}, ex => throw ex); CompleteCommand = ReactiveCommand.CreateFromTask(async _ => { if (!IsDrinkValid(out StringBuilder msgBuilder)) { await userInteraction.DisplayAlertAsync("Error", msgBuilder.ToString(), "Ok"); return; } var ingredients = DrinkIngredients .Select(ivm => ivm.UpdateDrinkIngredientModel()) .ToList(); await CompletedTemplateMethod(drinkRecipeBuilder, ingredients); await navigationService.PopAsync(); }, completedCommandCanExecute); CompleteCommand.ThrownExceptions.Subscribe(exception => throw exception); ByteImageTapRecognizerCommand = ReactiveCommand.CreateFromTask(async _ => { var photo = await crossMediaService.GetPhotoAsync(); if (photo != null) { ByteImage = photo; } }); }