public StatusViewModel(TimelineViewModelBase parent, StatusModel status, IEnumerable<long> initialBoundAccounts) { _parent = parent; // get status model Model = status; RetweetedOriginalModel = status.RetweetedOriginal; // bind accounts _bindingAccounts = initialBoundAccounts.Guard().ToArray(); // initialize users information _favoritedUsers = ViewModelHelperRx.CreateReadOnlyDispatcherCollectionRx( Model.FavoritedUsers, user => new UserViewModel(user), DispatcherHelper.UIDispatcher); CompositeDisposable.Add(_favoritedUsers); CompositeDisposable.Add( _favoritedUsers.ListenCollectionChanged() .Subscribe(_ => { RaisePropertyChanged(() => IsFavorited); RaisePropertyChanged(() => IsFavoritedUserExists); RaisePropertyChanged(() => FavoriteCount); })); _retweetedUsers = ViewModelHelperRx.CreateReadOnlyDispatcherCollectionRx( Model.RetweetedUsers, user => new UserViewModel(user), DispatcherHelper.UIDispatcher); CompositeDisposable.Add(_retweetedUsers); CompositeDisposable.Add( _retweetedUsers.ListenCollectionChanged() .Subscribe(_ => { RaisePropertyChanged(() => IsRetweeted); RaisePropertyChanged(() => IsRetweetedUserExists); RaisePropertyChanged(() => RetweetCount); })); if (RetweetedOriginalModel != null) { CompositeDisposable.Add( RetweetedOriginalModel.FavoritedUsers.ListenCollectionChanged() .Subscribe(_ => this.RaisePropertyChanged(() => IsFavorited))); CompositeDisposable.Add( RetweetedOriginalModel.RetweetedUsers.ListenCollectionChanged() .Subscribe(_ => this.RaisePropertyChanged(() => IsRetweeted))); } // resolve images var imgsubj = Model.ImagesSubject; if (imgsubj != null) { lock (imgsubj) { var subscribe = imgsubj .Finally(() => { RaisePropertyChanged(() => Images); RaisePropertyChanged(() => FirstImage); RaisePropertyChanged(() => IsImageAvailable); }) .Subscribe(); CompositeDisposable.Add(subscribe); } } // look-up in-reply-to if (!status.Status.InReplyToStatusId.HasValue) return; var inReplyTo = StoreHelper.GetTweet(status.Status.InReplyToStatusId.Value) .Subscribe(replyTo => { this._inReplyTo = replyTo; this.RaisePropertyChanged(() => this.IsInReplyToExists); this.RaisePropertyChanged(() => this.InReplyToUserImage); this.RaisePropertyChanged(() => this.InReplyToUserName); this.RaisePropertyChanged(() => this.InReplyToUserScreenName); this.RaisePropertyChanged(() => this.InReplyToBody); }); this.CompositeDisposable.Add(inReplyTo); }
public StatusViewModel(TimelineViewModelBase parent, StatusModel status, IEnumerable<long> initialBoundAccounts) { Interlocked.Increment(ref _instanceCount); CompositeDisposable.Add(() => Interlocked.Decrement(ref _instanceCount)); _parent = parent; // get status model Model = status; RetweetedOriginalModel = status.RetweetedOriginal; // bind accounts _bindingAccounts = initialBoundAccounts.Guard().ToArray(); // initialize users information _favoritedUsers = ViewModelHelperRx.CreateReadOnlyDispatcherCollectionRx( Model.FavoritedUsers, user => new UserViewModel(user), DispatcherHelper.UIDispatcher, DispatcherPriority.Background); CompositeDisposable.Add(_favoritedUsers); CompositeDisposable.Add( _favoritedUsers.ListenCollectionChanged() .Subscribe(_ => { RaisePropertyChanged(() => IsFavorited); RaisePropertyChanged(() => IsFavoritedUserExists); RaisePropertyChanged(() => FavoriteCount); })); _retweetedUsers = ViewModelHelperRx.CreateReadOnlyDispatcherCollectionRx( Model.RetweetedUsers, user => new UserViewModel(user), DispatcherHelper.UIDispatcher, DispatcherPriority.Background); CompositeDisposable.Add(_retweetedUsers); CompositeDisposable.Add( _retweetedUsers.ListenCollectionChanged() .Subscribe(_ => { RaisePropertyChanged(() => IsRetweeted); RaisePropertyChanged(() => IsRetweetedUserExists); RaisePropertyChanged(() => RetweetCount); })); if (RetweetedOriginalModel != null) { CompositeDisposable.Add( RetweetedOriginalModel.FavoritedUsers.ListenCollectionChanged() .Subscribe(_ => this.RaisePropertyChanged(() => IsFavorited))); CompositeDisposable.Add( RetweetedOriginalModel.RetweetedUsers.ListenCollectionChanged() .Subscribe(_ => this.RaisePropertyChanged(() => IsRetweeted))); } // resolve images var imgsubj = Model.ImagesSubject; if (imgsubj != null) { lock (imgsubj) { var subscribe = imgsubj .Finally(() => { RaisePropertyChanged(() => Images); RaisePropertyChanged(() => FirstImage); RaisePropertyChanged(() => IsImageAvailable); }) .Subscribe(); CompositeDisposable.Add(subscribe); } } // look-up in-reply-to _isInReplyToExists = status.Status.InReplyToStatusId.HasValue; }