protected override void Setup(CompositeDisposable disposable) { SetSupportActionBar(UserDetailsToolBar); var json = Intent.GetStringExtra(GetString(Resource.String.UserDetailsIntentKey)); if (!String.IsNullOrWhiteSpace(json)) { ViewModel = CompositionRoot.CreateUserDetailsViewModel(JsonConvert.DeserializeObject <UserModel>(json)); } else { ViewModel = CompositionRoot.CreateUserDetailsViewModel(null); } this.OneWayBind(ViewModel, vm => vm.UserName, v => v.UserDetailsCollapsingToolBar.Title, txt => !String.IsNullOrWhiteSpace(txt) ? txt : "Welcome") .DisposeWith(disposable); this.Bind(ViewModel, vm => vm.UserName, v => v.UserName.Text) .DisposeWith(disposable); this.WhenAnyValue(v => v.ViewModel.UserNameIsUnique, v => v.ViewModel.UserNameIsValid) .Subscribe(items => { if (!items.Item1) { UserNameTextInputLayout.Error = GetString(Resource.String.UserNameIsUnique); return; } if (!items.Item2) { UserNameTextInputLayout.Error = GetString(Resource.String.UserNameIsInvalid); return; } UserNameTextInputLayout.Error = String.Empty; }) .DisposeWith(disposable); this.Bind(ViewModel, vm => vm.Password, v => v.Password.Text) .DisposeWith(disposable); this.OneWayBind(ViewModel, vm => vm.ShowPasswordIsInvalid, v => v.PasswordTextInputLayout.Error, result => result ? GetString(Resource.String.PasswordIsInvalid) : String.Empty) .DisposeWith(disposable); this.WhenAnyValue(x => x.ViewModel.UserImage) .Subscribe(bytes => { if (bytes == null || bytes.Length == 0) { ToolBarImage.SetImageResource(0); } else { Func <CancellationToken, Task <Stream> > processMe = (ct) => { return(Task.FromResult((System.IO.Stream) new MemoryStream(bytes ?? new byte[0]))); }; ImageService.Instance .LoadStream(processMe) .Into(ToolBarImage); } }) .DisposeWith(disposable); this.OneWayBind(ViewModel, vm => vm.EnableSaveButton, v => v.UpdateUser.Enabled) .DisposeWith(disposable); this.BindCommand(ViewModel, vm => vm.SaveUser, v => v.UpdateUser) .DisposeWith(disposable); this.WhenAnyObservable(v => v.ViewModel.GoBackWithResult) .Subscribe(results => { Intent intent = new Intent(); intent.PutExtra( Resources.GetString(Resource.String.UserDetailsIntentKey), JsonConvert.SerializeObject(results) ); SetResult(Result.Ok, intent); OnBackPressed(); }) .DisposeWith(disposable); this.AddNewImageButton .Events() .Click.Subscribe(_ => { var imageIntent = new Intent(); imageIntent.SetType("image/*"); imageIntent.SetAction(Intent.ActionGetContent); StartActivityForResult( Intent.CreateChooser(imageIntent, "Select photo"), 0); }); SupportActionBar?.SetDisplayHomeAsUpEnabled(true); SupportActionBar?.SetHomeButtonEnabled(true); }