public TabViewModel(ColumnViewModel owner, TabModel tabModel) { _owner = owner; _model = tabModel; tabModel.Activate(); CompositeDisposable.Add( Observable.FromEvent( _ => Model.Timeline.OnNewStatusArrived += _, _ => Model.Timeline.OnNewStatusArrived -= _) .Subscribe(_ => UnreadCount++)); CompositeDisposable.Add( Observable.FromEvent<ScrollLockStrategy>( handler => Setting.ScrollLockStrategy.OnValueChanged += handler, handler => Setting.ScrollLockStrategy.OnValueChanged -= handler) .Subscribe(_ => { RaisePropertyChanged(() => IsScrollLock); RaisePropertyChanged(() => IsScrollLockExplicitEnabled); })); CompositeDisposable.Add(() => Model.Deactivate()); CompositeDisposable.Add( Observable.FromEvent( h => tabModel.OnBindingAccountIdsChanged += h, h => tabModel.OnBindingAccountIdsChanged -= h) .Subscribe(_ => DispatcherHolder.Enqueue(() => Timeline.ForEach(t => t.BindingAccounts = Model.BindingAccountIds)))); IsLoading = true; Observable.Defer( () => Observable.Start(() => Model.Timeline.ReadMore(null, true)) .Merge(Observable.Start(() => Model.ReceiveTimelines(null)))) .SelectMany(_ => _) .Finally(() => IsLoading = false) .Subscribe(); }
public TabViewModel(ColumnViewModel parent, TabModel tabModel) { _parent = parent; _model = tabModel; tabModel.Activate(); CompositeDisposable.Add( Observable.FromEvent<TwitterStatus>( h => Model.Timeline.NewStatusArrival += h, h => { if (Model.Timeline != null) Model.Timeline.NewStatusArrival -= h; }).Subscribe(_ => UnreadCount++)); BindTimeline(); CompositeDisposable.Add( Observable.FromEvent<ScrollLockStrategy>( handler => Setting.ScrollLockStrategy.ValueChanged += handler, handler => Setting.ScrollLockStrategy.ValueChanged -= handler) .Subscribe(_ => { RaisePropertyChanged(() => IsScrollLock); RaisePropertyChanged(() => IsScrollLockExplicitEnabled); })); CompositeDisposable.Add(() => Model.Deactivate()); if (Model.FilterQuery.PredicateTreeRoot != null) { CompositeDisposable.Add( Observable.FromEvent( h => Model.FilterQuery.InvalidateRequired += h, h => Model.FilterQuery.InvalidateRequired -= h) .Subscribe(_ => { var count = Interlocked.Increment(ref _refreshCount); Observable.Timer(TimeSpan.FromSeconds(3)) .Where(__ => Interlocked.CompareExchange(ref _refreshCount, 0, count) == count) .Subscribe(__ => { System.Diagnostics.Debug.WriteLine("* invalidate executed: " + Name); // regenerate filter query Model.RefreshEvaluator(); Model.InvalidateCollection(); BindTimeline(); }); })); } CompositeDisposable.Add( Observable.FromEvent( h => tabModel.BindingAccountIdsChanged += h, h => tabModel.BindingAccountIdsChanged -= h) .Subscribe( _ => DispatcherHolder.Enqueue( () => Timeline.ForEach(t => t.BindingAccounts = Model.BindingAccountIds), DispatcherPriority.Background))); CompositeDisposable.Add( Observable.FromEvent<bool>( h => tabModel.ConfigurationUpdated += h, h => tabModel.ConfigurationUpdated -= h) .Subscribe(timelineModelRegenerated => { RaisePropertyChanged(() => Name); RaisePropertyChanged(() => UnreadCount); if (timelineModelRegenerated) { BindTimeline(); } })); CompositeDisposable.Add( Observable.FromEvent( h => tabModel.SetPhysicalFocusRequired += h, h => tabModel.SetPhysicalFocusRequired -= h) .Subscribe(_ => this.Messenger.Raise(new InteractionMessage("SetPhysicalFocus")))); }