private void SetVerticalOffset(double physicalOffset, bool updateUI, bool updateScrollViewer)
        {
            var  adjustedOffset = GridModel.DoubleArithmetics.Ceiling(physicalOffset);
            bool needUpdate     = !LayoutDoubleUtil.AreClose(this.lastScrollOffset.Y, physicalOffset) || physicalOffset < 0;

            this.lastScrollOffset.Y = adjustedOffset;

            if (needUpdate)
            {
                if (updateUI && this.CellsPanel != null)
                {
                    if ((this.model.pendingMeasureFlags & InvalidateMeasureFlags.Header) == InvalidateMeasureFlags.Header && this.columnHeadersPanel != null)
                    {
                        this.columnHeadersPanel.Measure();
                        this.columnHeadersPanel.Arrange();
                    }
                    this.CellsPanel.Measure();
                    this.CellsPanel.Arrange();
                }

                if (updateScrollViewer)
                {
                    this.ScrollViewer.ChangeView(null, adjustedOffset, null, true);

                    ////Ensure that scrollviewer has updated its position.
                    if (updateUI)
                    {
                        this.ScrollViewer.UpdateLayout();
                    }
                }
            }
        }
        private void SetHorizontalOffset(double physicalOffset, bool updateUI, bool updateScrollViewer)
        {
            var  adjustedOffset = GridModel.DoubleArithmetics.Ceiling(physicalOffset);
            bool needUpdate     = !LayoutDoubleUtil.AreClose(this.lastScrollOffset.X, physicalOffset) || physicalOffset < 0;

            this.lastScrollOffset.X = adjustedOffset;

            if (needUpdate)
            {
                // TODO: The updateUI flag should be removed and all the needed updates should be processed by the UpdateService
                if (updateUI)
                {
                    if (this.columnHeadersPanel != null)
                    {
                        this.columnHeadersPanel.Measure();
                        this.columnHeadersPanel.Arrange();
                    }

                    if (this.CellsPanel != null)
                    {
                        this.CellsPanel.Measure();
                        this.CellsPanel.Arrange();
                    }
                }

                if (updateScrollViewer)
                {
                    this.ScrollViewer.ChangeView(adjustedOffset, null, null, true);

                    // Ensure that scrollviewer has updated its position.
                    if (updateUI)
                    {
                        this.ScrollViewer.UpdateLayout();
                    }
                }
            }
        }