VirtualLayoutContextAdapter.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. namespace Avalonia.Layout
  4. {
  5. public class VirtualLayoutContextAdapter : NonVirtualizingLayoutContext
  6. {
  7. private readonly VirtualizingLayoutContext _virtualizingContext;
  8. private ChildrenCollection? _children;
  9. public VirtualLayoutContextAdapter(VirtualizingLayoutContext virtualizingContext)
  10. {
  11. _virtualizingContext = virtualizingContext;
  12. }
  13. protected override object? LayoutStateCore
  14. {
  15. get => _virtualizingContext.LayoutState;
  16. set => _virtualizingContext.LayoutState = value;
  17. }
  18. protected override IReadOnlyList<ILayoutable> ChildrenCore =>
  19. _children ?? (_children = new ChildrenCollection(_virtualizingContext));
  20. private class ChildrenCollection : IReadOnlyList<ILayoutable>
  21. {
  22. private readonly VirtualizingLayoutContext _context;
  23. public ChildrenCollection(VirtualizingLayoutContext context) => _context = context;
  24. public ILayoutable this[int index] => _context.GetOrCreateElementAt(index);
  25. public int Count => _context.ItemCount;
  26. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  27. public IEnumerator<ILayoutable> GetEnumerator()
  28. {
  29. for (var i = 0; i < Count; ++i)
  30. {
  31. yield return this[i];
  32. }
  33. }
  34. }
  35. }
  36. }