public HeightViewModel(IObservable <int> SourceSize, double ItemHeight = 25) { this.ItemHeight = ItemHeight; SourceSize .Select(c => c * ItemHeight) .ToProperty(this, x => x.ListHeight, out _listHeight) .DisposeWith(_cleanup); PagingRequests = this.WhenAnyValue(x => x.ListOffset, x => x.ViewportHeight, (offset, height) => new { offset, height }) .Select(x => new VirtualRequest(IndexFromOffset(x.offset), Count(x.offset, x.height))) .DistinctUntilChanged() .Do(rq => _lastRequest = rq); this.WhenAnyValue(x => x.ListHeight, x => x.ViewportHeight, (l, v) => Math.Max(0, l - v)) .ToProperty(this, x => x.ScrollableMaximum, out _scrollableMaximum); this.WhenAnyValue(x => x.ItemHeight) .Select(h => h * 3) .ToProperty(this, x => x.SmallChange, out _smallChange); }
public IObservable <IVirtualChangeSet <T> > Run() { return(Observable.Create <IVirtualChangeSet <T> >( observer => { var locker = new object(); var all = new List <T>(); var virtualised = new ChangeAwareList <T>(); IVirtualRequest parameters = new VirtualRequest(0, 25); var requestStream = _requests.Synchronize(locker).Select( request => { parameters = request; return CheckParamsAndVirtualise(all, virtualised, request); }); var dataChanged = _source.Synchronize(locker).Select(changes => Virtualise(all, virtualised, parameters, changes)); // TODO: Remove this shared state stuff ie. _parameters return requestStream.Merge(dataChanged).Where(changes => changes is not null && changes.Count != 0) .Select(x => x !) .Select(changes => new VirtualChangeSet <T>(changes, new VirtualResponse(virtualised.Count, parameters.StartIndex, all.Count))).SubscribeSafe(observer); })); }
public Virtualiser(VirtualRequest request = null) { _parameters = request ?? new VirtualRequest(); }
public void RunVirtualizationInAppDomain(SerializableDelegate <Action <VirtualRequest> > script) { var virtualRequest = new VirtualRequest(); script.Delegate(virtualRequest); }