public BookViewModel(Book book, SubscriptionService subs) { Book = book; ButtonsVisible = false; // hides buttons when user is not signed-in subs .WhenAnyValue(x => x.Subscription) // when users subscribption changes .Select(s => s != null) // set boolean if not null .ObserveOn(RxApp.MainThreadScheduler) // observe on UI thread .Subscribe(Observer.Create <bool>(SetButtonVisibility)); // observe changes in SetButtonVisibility method // update subscription status by observing users subscription subs .WhenAnyValue(x => x.Subscription) // when users subscribption changes .Where(s => s != null && s.SubscribedBookIds != null) // where user has some existing subscribtions .Select(s => s.SubscribedBookIds.Contains(this.Book.Id)) // set boolean if subscription contains this book .ObserveOn(RxApp.MainThreadScheduler) // observe on UI thread .Subscribe(Observer.Create <bool>(SetSubscription)); // observe changes in SetSubscription method // subscribe command Subscribe = ReactiveCommand.CreateFromTask(async() => { await subs.Add(Book.Id); }); // unsubscribe command UnSubscribe = ReactiveCommand.CreateFromTask(async() => { await subs.Remove(Book.Id); }); }