dotnet/wpf · error · InvalidOperationException

SR.PageCacheSizeNotAllowed

Error message

SR.PageCacheSizeNotAllowed

What it means

The HierarchicalVirtualizationConstraints property on TreeViewItem rejects VirtualizationCacheLengthUnit.Page cache units, throwing InvalidOperationException. For hierarchical (TreeView) virtualization only Item or Pixel cache units are permitted; a Page-sized cache is not supported on this control type.

Solutions

  1. Change the cache unit to VirtualizationCacheLengthUnit.Item or .Pixel.
  2. Use separate styles for TreeViewItem versus ListBox/ItemsControl virtualization settings.
  3. If bindings set the value, add a converter that translates Page into Pixel/Item.

Example fix

// before
treeViewItem.HierarchicalVirtualizationConstraints =
    new HierarchicalVirtualizationConstraints(new VirtualizationCacheLength(1), VirtualizationCacheLengthUnit.Page, 0);
// after
treeViewItem.HierarchicalVirtualizationConstraints =
    new HierarchicalVirtualizationConstraints(new VirtualizationCacheLength(1), VirtualizationCacheLengthUnit.Pixel, 0);
Defensive patterns

Strategy: validation

Validate before calling

if (constraints.CacheLengthUnit == VirtualizationCacheLengthUnit.Page)
    constraints = new HierarchicalVirtualizationConstraints(constraints.CacheLength, VirtualizationCacheLengthUnit.Pixel, 0);
treeViewItem.HierarchicalVirtualizationConstraints = constraints;

Try / catch

try { item.HierarchicalVirtualizationConstraints = c; }
catch (InvalidOperationException) { /* Page cache not allowed on TreeViewItem; use Pixel/Item */ }

Prevention

When it happens

Trigger: Setting itemHierarchicalVirtualizationConstraints.CacheLengthUnit = VirtualizationCacheLengthUnit.Page on a TreeViewItem (directly or via binding), then triggering the setter.

Common situations: Copying virtualization settings from a flat ItemsControl (which supports Page) to a TreeView; configuring HierarchicalVirtualizationCacheLength in a style shared across control types.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/6d3c2f82719826f2. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/TreeViewItem.cs:354

        #region Internal Methods

        protected override Size ArrangeOverride(Size arrangeSize)
        {
            arrangeSize = base.ArrangeOverride(arrangeSize);

            Helper.ComputeCorrectionFactor(ParentTreeView, this, ItemsHost, HeaderElement);

            return arrangeSize;
        }

        HierarchicalVirtualizationConstraints IHierarchicalVirtualizationAndScrollInfo.Constraints
        {
            get { return GroupItem.HierarchicalVirtualizationConstraintsField.GetValue(this); }
            set
            {
                if (value.CacheLengthUnit == VirtualizationCacheLengthUnit.Page)
                {
                    throw new InvalidOperationException(SR.PageCacheSizeNotAllowed);
                }
                GroupItem.HierarchicalVirtualizationConstraintsField.SetValue(this, value);
            }
        }

        HierarchicalVirtualizationHeaderDesiredSizes IHierarchicalVirtualizationAndScrollInfo.HeaderDesiredSizes
        {
            get
            {
                FrameworkElement headerElement = HeaderElement;
                Size pixelHeaderSize = this.IsVisible && headerElement != null ? headerElement.DesiredSize : new Size();

                Helper.ApplyCorrectionFactorToPixelHeaderSize(ParentTreeView, this, ItemsHost, ref pixelHeaderSize);

                Size logicalHeaderSize = new Size(DoubleUtil.GreaterThanZero(pixelHeaderSize.Width) ? 1 : 0,
                                DoubleUtil.GreaterThanZero(pixelHeaderSize.Height) ? 1 : 0);

                return new HierarchicalVirtualizationHeaderDesiredSizes(logicalHeaderSize, pixelHeaderSize);

View on GitHub (pinned to 81131a70a4)