[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-maui-collectionview":3,"mdc-jwssc0-key":37,"related-org-dotnet-maui-collectionview":3916,"related-repo-dotnet-maui-collectionview":4080},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"maui-collectionview","implement CollectionView in .NET MAUI","Guidance for implementing CollectionView in .NET MAUI apps — data display, layouts (list & grid), selection, grouping, scrolling, empty views, templates, incremental loading, swipe actions, and pull-to-refresh. USE FOR: \"CollectionView\", \"list view\", \"grid layout\", \"data template\", \"item template\", \"grouping\", \"pull to refresh\", \"incremental loading\", \"swipe actions\", \"empty view\", \"selection mode\", \"scroll to item\", displaying scrollable data, replacing ListView. DO NOT USE FOR: simple static layouts without scrollable data (use Grid or StackLayout), map pin lists (use Microsoft.Maui.Controls.Maps), table-based data entry forms, non-MAUI list controls, CarouselView or BindableLayout questions, platform-specific handler or renderer customization, diagnosing CollectionView bugs in the MAUI framework itself, or general MVVM\u002Fbinding questions that merely happen to mention a list (use maui-data-binding).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"dotnet",".NET (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdotnet.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"MAUI","maui","tag",{"name":17,"slug":18,"type":15},".NET","net",{"name":20,"slug":21,"type":15},"Mobile","mobile",{"name":23,"slug":24,"type":15},"UI Components","ui-components",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-08-01T05:42:27.18013","MIT",332,[31],"agent-skills",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31],"Repository for skills to assist AI coding agents with .NET and C#","https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills\u002Ftree\u002FHEAD\u002Fplugins\u002Fdotnet-maui\u002Fskills\u002Fmaui-collectionview","---\nname: maui-collectionview\ndescription: >\n  Guidance for implementing CollectionView in .NET MAUI apps — data display,\n  layouts (list & grid), selection, grouping, scrolling, empty views, templates,\n  incremental loading, swipe actions, and pull-to-refresh.\n  USE FOR: \"CollectionView\", \"list view\", \"grid layout\", \"data template\",\n  \"item template\", \"grouping\", \"pull to refresh\", \"incremental loading\",\n  \"swipe actions\", \"empty view\", \"selection mode\", \"scroll to item\",\n  displaying scrollable data, replacing ListView.\n  DO NOT USE FOR: simple static layouts without scrollable data (use Grid or\n  StackLayout), map pin lists (use Microsoft.Maui.Controls.Maps), table-based\n  data entry forms, non-MAUI list controls, CarouselView or BindableLayout\n  questions, platform-specific handler or renderer customization, diagnosing\n  CollectionView bugs in the MAUI framework itself, or general MVVM\u002Fbinding\n  questions that merely happen to mention a list (use maui-data-binding).\nlicense: MIT\n---\n\n# CollectionView — .NET MAUI\n\n`CollectionView` is the primary control for displaying scrollable lists and grids of data in .NET MAUI. It replaces `ListView` with better performance, flexible layouts, and no `ViewCell` requirement.\n\n## When to Use\n\n- Displaying a scrollable list or grid of data items\n- Binding a collection of objects to a templated item layout\n- Adding selection (single or multiple), grouping, or pull-to-refresh\n- Implementing infinite scroll \u002F incremental loading\n- Showing swipe actions on list items\n- Displaying an empty state when no data is available\n\n## When Not to Use\n\n- Static layouts with a fixed number of items — use `Grid` or `StackLayout` directly\n- Map pin lists — use the `Microsoft.Maui.Controls.Maps` NuGet package\n- Table-based data entry forms — use standard form controls\n- Simple text-only lists with no interaction — consider `BindableLayout` on a `StackLayout`\n\n## Scope Control — Answer Only What Was Asked\n\nThis skill is a **reference you consult**, not a checklist you apply. Most requests\nneed one or two sections from it. Pulling in the rest makes the answer worse.\n\n**Stop conditions — do NOT act when:**\n\n- **The user asked a narrow question.** Answer that question only. Do not append\n  grouping, swipe actions, empty views, snap points, or performance tips that\n  were not asked about.\n- **The user's existing code already works.** Do not rewrite working markup to\n  match the examples here. Point out a concrete defect; if there is none, say so\n  and answer the question that was asked.\n- **The change is stylistic.** Renaming, reordering attributes, or restructuring\n  a template that already behaves correctly is churn, not a fix.\n- **The control isn't `CollectionView`.** `CarouselView`, `BindableLayout`, and\n  `ListView`-in-maintenance code have different rules. Do not rewrite `ListView`\n  code the user did not ask about — but if they ask *which* control to use, or are\n  migrating from Xamarin.Forms, recommend `CollectionView` (see\n  [Migrating from ListView](#migrating-from-listview)).\n- **The problem is really a binding, DI, or navigation problem** that happens to\n  involve a list — defer to `maui-data-binding`, `maui-dependency-injection`, or\n  `maui-shell-navigation`.\n\n**The API sections below are a reference, not a checklist — offer them only when\nrelevant.** Four rules are non-negotiable, because violating them produces code that\ndoes not work or silently loses compile-time checking:\n\n1. Never use `ViewCell` as a `DataTemplate` root in `CollectionView`.\n2. Use `ObservableCollection\u003CT>` when the list mutates after first render.\n3. Mutate the bound collection on the UI thread.\n4. Set `x:DataType` on every `DataTemplate` (and on the page root) for compiled bindings.\n\nEverything else — sizing strategy, snap points, header\u002Ffooter, empty views — is\noptional and should be offered only when it addresses the user's actual problem.\n\n## Inputs\n\n- A data source (typically `ObservableCollection\u003CT>`) bound to `ItemsSource`\n- A `DataTemplate` defining how each item renders\n- Optional: layout configuration, selection mode, grouping model, empty view\n\n## Basic Setup\n\nA complete, copy-pasteable page. Two things are load-bearing: the `xmlns:models`\ndeclaration that every `x:DataType=\"models:Item\"` in this skill assumes, and the\n**root `x:DataType`** — without it the outer `ItemsSource` binding is not compiled:\n\n```xml\n\u003CContentPage xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdotnet\u002F2021\u002Fmaui\"\n             xmlns:x=\"http:\u002F\u002Fschemas.microsoft.com\u002Fwinfx\u002F2009\u002Fxaml\"\n             xmlns:models=\"clr-namespace:MyApp.Models\"\n             xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n             x:DataType=\"vm:ItemsViewModel\"\n             x:Class=\"MyApp.ItemsPage\">\n    \u003CContentPage.BindingContext>\n        \u003Cvm:ItemsViewModel \u002F>\n    \u003C\u002FContentPage.BindingContext>\n    \u003CCollectionView ItemsSource=\"{Binding Items}\">\n        \u003CCollectionView.ItemTemplate>\n            \u003CDataTemplate x:DataType=\"models:Item\">\n                \u003CHorizontalStackLayout Padding=\"8\" Spacing=\"8\">\n                    \u003CImage Source=\"{Binding Icon}\" WidthRequest=\"40\" HeightRequest=\"40\" \u002F>\n                    \u003CLabel Text=\"{Binding Name}\" VerticalOptions=\"Center\" \u002F>\n                \u003C\u002FHorizontalStackLayout>\n            \u003C\u002FDataTemplate>\n        \u003C\u002FCollectionView.ItemTemplate>\n    \u003C\u002FCollectionView>\n\u003C\u002FContentPage>\n```\n\nLater snippets show only the `CollectionView` element. When you hand a snippet to a\nuser, include the matching `xmlns:` declaration for any prefix it uses, or the XAML\nwill not compile.\n\nThe inline `\u003CContentPage.BindingContext>` above keeps the example self-contained. In\nan app that uses dependency injection, register the ViewModel instead and assign it\nthrough constructor injection (`BindingContext = vm;`) — see the\n**maui-dependency-injection** skill.\n\n**Key rules:**\n\n- Bind `ItemsSource` to an `ObservableCollection\u003CT>` so the UI updates on add\u002Fremove.\n- Each item template root must be a `Layout` or `View` — **never use `ViewCell`**.\n- Always set `x:DataType` on `DataTemplate` for compiled bindings.\n\n## Layouts\n\nSet `ItemsLayout` to control arrangement. Default is `VerticalList`.\n\n| Layout | XAML value |\n|---|---|\n| Vertical list | `VerticalList` (default) |\n| Horizontal list | `HorizontalList` |\n| Vertical grid | `GridItemsLayout` with `Orientation=\"Vertical\"` |\n| Horizontal grid | `GridItemsLayout` with `Orientation=\"Horizontal\"` |\n\n### Grid Layout\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding Items}\">\n    \u003CCollectionView.ItemsLayout>\n        \u003CGridItemsLayout Orientation=\"Vertical\"\n                         Span=\"2\"\n                         VerticalItemSpacing=\"8\"\n                         HorizontalItemSpacing=\"8\" \u002F>\n    \u003C\u002FCollectionView.ItemsLayout>\n    \u003CCollectionView.ItemTemplate>\n        \u003CDataTemplate x:DataType=\"models:Item\">\n            \u003CBorder Padding=\"8\" StrokeThickness=\"0\">\n                \u003CVerticalStackLayout>\n                    \u003CImage Source=\"{Binding Image}\" HeightRequest=\"120\" Aspect=\"AspectFill\" \u002F>\n                    \u003CLabel Text=\"{Binding Name}\" FontAttributes=\"Bold\" \u002F>\n                \u003C\u002FVerticalStackLayout>\n            \u003C\u002FBorder>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.ItemTemplate>\n\u003C\u002FCollectionView>\n```\n\n### Horizontal List\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding Items}\"\n                ItemsLayout=\"HorizontalList\" \u002F>\n```\n\n## Selection\n\n### Selection Mode\n\n| Mode | Property to bind | Binding mode |\n|---|---|---|\n| `None` | — | — |\n| `Single` | `SelectedItem` | `TwoWay` |\n| `Multiple` | `SelectedItems` | `OneWay` |\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding Items}\"\n                SelectionMode=\"Single\"\n                SelectedItem=\"{Binding CurrentItem, Mode=TwoWay}\"\n                SelectionChangedCommand=\"{Binding ItemSelectedCommand}\" \u002F>\n```\n\nFor `Multiple` selection, bind `SelectedItems` (type `IList\u003Cobject>`):\n\n```xml\n\u003CCollectionView SelectionMode=\"Multiple\"\n                SelectedItems=\"{Binding ChosenItems, Mode=OneWay}\" \u002F>\n```\n\n### Selected Visual State\n\nHighlight selected items using `VisualStateManager`:\n\n```xml\n\u003CCollectionView.ItemTemplate>\n    \u003CDataTemplate x:DataType=\"models:Item\">\n        \u003CGrid Padding=\"8\">\n            \u003CVisualStateManager.VisualStateGroups>\n                \u003CVisualStateGroup Name=\"CommonStates\">\n                    \u003CVisualState Name=\"Normal\">\n                        \u003CVisualState.Setters>\n                            \u003CSetter Property=\"BackgroundColor\" Value=\"Transparent\" \u002F>\n                        \u003C\u002FVisualState.Setters>\n                    \u003C\u002FVisualState>\n                    \u003CVisualState Name=\"Selected\">\n                        \u003CVisualState.Setters>\n                            \u003CSetter Property=\"BackgroundColor\"\n                                    Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource PrimaryDark}}\" \u002F>\n                        \u003C\u002FVisualState.Setters>\n                    \u003C\u002FVisualState>\n                \u003C\u002FVisualStateGroup>\n            \u003C\u002FVisualStateManager.VisualStateGroups>\n            \u003CLabel Text=\"{Binding Name}\" \u002F>\n        \u003C\u002FGrid>\n    \u003C\u002FDataTemplate>\n\u003C\u002FCollectionView.ItemTemplate>\n```\n\n## Grouping\n\n1. Create a group class inheriting from `List\u003CT>`:\n\n```csharp\npublic class AnimalGroup : List\u003CAnimal>\n{\n    public string Name { get; }\n    public AnimalGroup(string name, List\u003CAnimal> animals) : base(animals)\n    {\n        Name = name;\n    }\n}\n```\n\n2. Bind to `ObservableCollection\u003CAnimalGroup>` and set `IsGrouped=\"True\"`:\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding AnimalGroups}\"\n                IsGrouped=\"True\">\n    \u003CCollectionView.GroupHeaderTemplate>\n        \u003CDataTemplate x:DataType=\"models:AnimalGroup\">\n            \u003CLabel Text=\"{Binding Name}\"\n                   FontAttributes=\"Bold\"\n                   BackgroundColor=\"{StaticResource Gray100}\"\n                   Padding=\"8\" \u002F>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.GroupHeaderTemplate>\n    \u003CCollectionView.ItemTemplate>\n        \u003CDataTemplate x:DataType=\"models:Animal\">\n            \u003CLabel Text=\"{Binding Name}\" Padding=\"16,4\" \u002F>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.ItemTemplate>\n\u003C\u002FCollectionView>\n```\n\n## Pull-to-Refresh\n\nWrap `CollectionView` in a `RefreshView`. Set `IsRefreshing` back to `false` when done:\n\n```xml\n\u003CRefreshView IsRefreshing=\"{Binding IsRefreshing}\"\n             Command=\"{Binding RefreshCommand}\">\n    \u003CCollectionView ItemsSource=\"{Binding Items}\" \u002F>\n\u003C\u002FRefreshView>\n```\n\n## Incremental Loading (Infinite Scroll)\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding Items}\"\n                RemainingItemsThreshold=\"5\"\n                RemainingItemsThresholdReachedCommand=\"{Binding LoadMoreCommand}\" \u002F>\n```\n\n> ⚠️ **Do NOT use with non-virtualizing layouts.** `LinearItemsLayout` and `GridItemsLayout` support virtualization. Using `BindableLayout` on a `StackLayout` as an alternative to `CollectionView` has no virtualization, which triggers infinite threshold-reached events.\n\n## SwipeView — Binding from Inside DataTemplate\n\nCommands inside a `DataTemplate` can't directly reach your ViewModel. Use `RelativeSource AncestorType`:\n\n```xml\n\u003CCollectionView.ItemTemplate>\n    \u003CDataTemplate x:DataType=\"models:Item\">\n        \u003CSwipeView>\n            \u003CSwipeView.RightItems>\n                \u003CSwipeItems>\n                    \u003CSwipeItem Text=\"Delete\"\n                               BackgroundColor=\"Red\"\n                               Command=\"{Binding BindingContext.DeleteCommand, Source={RelativeSource AncestorType={x:Type ContentPage}}}\"\n                               CommandParameter=\"{Binding}\" \u002F>\n                \u003C\u002FSwipeItems>\n            \u003C\u002FSwipeView.RightItems>\n            \u003CGrid Padding=\"8\">\n                \u003CLabel Text=\"{Binding Name}\" \u002F>\n            \u003C\u002FGrid>\n        \u003C\u002FSwipeView>\n    \u003C\u002FDataTemplate>\n\u003C\u002FCollectionView.ItemTemplate>\n```\n\n## EmptyView\n\nShown when `ItemsSource` is empty or null.\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding SearchResults}\"\n                EmptyView=\"No items found.\" \u002F>\n```\n\nFor a custom empty view, wrap in `ContentView`:\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding SearchResults}\">\n    \u003CCollectionView.EmptyView>\n        \u003CContentView>\n            \u003CVerticalStackLayout HorizontalOptions=\"Center\" VerticalOptions=\"Center\">\n                \u003CImage Source=\"empty_state.png\" WidthRequest=\"120\" \u002F>\n                \u003CLabel Text=\"Nothing here yet\" HorizontalTextAlignment=\"Center\" \u002F>\n            \u003C\u002FVerticalStackLayout>\n        \u003C\u002FContentView>\n    \u003C\u002FCollectionView.EmptyView>\n\u003C\u002FCollectionView>\n```\n\n## Headers and Footers\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding Items}\">\n    \u003CCollectionView.Header>\n        \u003CLabel Text=\"Header\" FontAttributes=\"Bold\" Padding=\"8\" \u002F>\n    \u003C\u002FCollectionView.Header>\n    \u003CCollectionView.Footer>\n        \u003CLabel Text=\"Footer\" FontAttributes=\"Italic\" Padding=\"8\" \u002F>\n    \u003C\u002FCollectionView.Footer>\n\u003C\u002FCollectionView>\n```\n\nUse `HeaderTemplate` \u002F `FooterTemplate` when headers or footers are data-bound.\n\n## Scrolling\n\n### ScrollTo\n\nProgrammatically scroll by index or item:\n\n```csharp\n\u002F\u002F Scroll to index\ncollectionView.ScrollTo(index: 10, position: ScrollToPosition.Center, animate: true);\n\n\u002F\u002F Scroll to item\ncollectionView.ScrollTo(item: myItem, position: ScrollToPosition.MakeVisible, animate: true);\n```\n\n| ScrollToPosition | Behavior |\n|---|---|\n| `MakeVisible` | Scrolls just enough to make the item visible |\n| `Start` | Scrolls item to the start of the viewport |\n| `Center` | Scrolls item to the center of the viewport |\n| `End` | Scrolls item to the end of the viewport |\n\n### Snap Points\n\n```xml\n\u003CCollectionView.ItemsLayout>\n    \u003CLinearItemsLayout Orientation=\"Horizontal\"\n                       SnapPointsType=\"MandatorySingle\"\n                       SnapPointsAlignment=\"Center\" \u002F>\n\u003C\u002FCollectionView.ItemsLayout>\n```\n\n- `SnapPointsType`: `None`, `Mandatory`, `MandatorySingle`\n- `SnapPointsAlignment`: `Start`, `Center`, `End`\n\n## Migrating from ListView\n\n`ListView` still compiles, but **as of .NET 10** it is marked `[Obsolete]`\n(\"*ListView is deprecated. Please use CollectionView instead.*\"). It is **not**\nobsolete on .NET 9 and earlier, so check the project's target framework before\ndescribing it as deprecated. **If the user asks\nwhich control to use, or is migrating from Xamarin.Forms, recommend\n`CollectionView`** — it is faster, needs no `ViewCell`, and supports flexible\nlayouts. What to avoid is silently rewriting `ListView` code the user did not ask\nyou to touch.\n\n| `ListView` | `CollectionView` equivalent |\n|---|---|\n| `ViewCell` template root | Any `View`\u002F`Layout` root — **`ViewCell` is not supported** |\n| `ItemSelected` event | `SelectionChanged` event, or `SelectionChangedCommand` |\n| `ItemTapped` event | A `TapGestureRecognizer` in the item template — `SelectionChanged` only fires when the selection *changes*, so it will not re-fire on tapping the already-selected item |\n| `IsPullToRefreshEnabled` + `Refreshing` | Wrap the `CollectionView` in a `RefreshView` |\n| `IsGroupingEnabled` | `IsGrouped` |\n| `HasUnevenRows=\"True\"` | Default `ItemSizingStrategy=\"MeasureAllItems\"` |\n| `RowHeight` (fixed height) | Set the height in the item template. `MeasureFirstItem` only reuses the first item's measured size — it is not an explicit row height |\n| `SeparatorVisibility` \u002F `SeparatorColor` | **No equivalent** — draw a `BoxView`\u002F`Border` in the item template |\n\nThe missing separator API is the most common migration surprise: `CollectionView`\nhas no built-in separators, so add one to the template yourself.\n\n## Performance Tips\n\nApply these only when the user reports a performance problem or explicitly asks\nabout performance — they are not a default checklist.\n\n- **Use `MeasureFirstItem`** for uniform item sizes — significantly faster than the default\n  `MeasureAllItems`, which measures every item individually. Set it on the `CollectionView`\n  itself (it is declared on `StructuredItemsView`), **not** on `LinearItemsLayout` \u002F\n  `GridItemsLayout`:\n  ```xml\n  \u003CCollectionView ItemsSource=\"{Binding Items}\"\n                  ItemSizingStrategy=\"MeasureFirstItem\">\n      \u003CCollectionView.ItemTemplate>\n          \u003CDataTemplate x:DataType=\"models:Item\">\n              \u003CGrid Padding=\"8\" ColumnDefinitions=\"44,*\" ColumnSpacing=\"8\">\n                  \u003CImage WidthRequest=\"44\" HeightRequest=\"44\" \u002F>\n                  \u003CLabel Grid.Column=\"1\" Text=\"{Binding Name}\" VerticalOptions=\"Center\" \u002F>\n              \u003C\u002FGrid>\n          \u003C\u002FDataTemplate>\n      \u003C\u002FCollectionView.ItemTemplate>\n  \u003C\u002FCollectionView>\n  ```\n  **When `MeasureFirstItem` is the wrong choice** — keep the default `MeasureAllItems` if:\n  - Items vary in height (wrapping text, optional rows, images of differing aspect) — the\n    first item's size is applied to all, so the rest are clipped or stretched.\n  - A `DataTemplateSelector` returns different templates — the first item won't represent\n    the others.\n  - The first item is atypical (a header-like or \"featured\" row) — every item inherits its\n    size. Fixing this by reordering data is a smell; use `MeasureAllItems` instead.\n  - Item size depends on runtime data that isn't loaded yet when the first item is measured.\n- **Use `ObservableCollection\u003CT>` when the list mutates after first render.** It implements\n  `INotifyCollectionChanged`, so in-place `Add`\u002F`Remove`\u002F`Insert` update the UI incrementally.\n  A `List\u003CT>` is fine for a list that never changes after it is bound. Note that *replacing*\n  `ItemsSource` re-renders everything regardless of the collection type — so mutate the bound\n  collection in place rather than reassigning it.\n- **Update collections on the UI thread** — `MainThread.BeginInvokeOnMainThread(() => Items.Add(item))`.\n\n## Common Pitfalls\n\n| Issue | Fix |\n|---|---|\n| UI doesn't update when items change | Use `ObservableCollection\u003CT>`, not `List\u003CT>`. |\n| App crashes or blank items | **Never use `ViewCell`** — use `Grid`, `StackLayout`, or any `View` as template root. |\n| Items disappear or layout breaks | Always update `ItemsSource` and the collection on the **UI thread** (`MainThread.BeginInvokeOnMainThread`). |\n| Incremental loading fires endlessly | Don't use `StackLayout` as layout; use `LinearItemsLayout` or `GridItemsLayout`. |\n| EmptyView doesn't render correctly | Wrap custom empty views in `ContentView`. |\n| Poor scroll performance | Use `MeasureFirstItem` sizing strategy for uniform item sizes. |\n| `ItemSizingStrategy` doesn't compile | It is declared on `StructuredItemsView` — set it on `\u003CCollectionView>`, not on `\u003CLinearItemsLayout>` \u002F `\u003CGridItemsLayout>`. |\n| Items clipped or stretched | `MeasureFirstItem` assumes uniform item size. Use the default `MeasureAllItems` for variable-height items. |\n| Selected state not visible | Add `VisualState Name=\"Selected\"` to the item template root element. |\n| Binding errors in SwipeView commands | Use `RelativeSource AncestorType` to reach the ViewModel from inside the item template. |\n\n## Validation\n\nBefore returning CollectionView markup you wrote or edited, confirm:\n\n- [ ] The `DataTemplate` root is a `View`\u002F`Layout` — **not** `ViewCell`.\n- [ ] `DataTemplate` declares `x:DataType` for compiled bindings.\n- [ ] `ItemsSource` is bound to `ObservableCollection\u003CT>` if the list mutates.\n- [ ] `ItemSizingStrategy` (if used) is on `\u003CCollectionView>`, not on the layout.\n- [ ] `Multiple` selection binds `SelectedItems`; `Single` binds `SelectedItem` (`TwoWay`).\n- [ ] `RefreshView.IsRefreshing` is set back to `false` when the refresh completes.\n- [ ] The answer covers **only** what the user asked — no unrequested sections.\n\n## References\n\n- [CollectionView overview](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002F)\n- [CollectionView layout](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Flayout)\n- [CollectionView selection](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Fselection)\n- [CollectionView grouping](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Fgrouping)\n- [CollectionView scrolling](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Fscrolling)\n- [CollectionView EmptyView](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Femptyview)\n",{"data":38,"body":39},{"name":4,"description":6,"license":28},{"type":40,"children":41},"root",[42,51,80,87,122,128,188,194,207,215,350,360,428,433,439,477,483,523,716,736,763,771,843,849,868,978,985,1136,1142,1165,1171,1177,1285,1323,1350,1373,1379,1392,1574,1580,1595,1668,1691,1821,1827,1863,1902,1908,1938,1988,1994,2013,2152,2158,2170,2193,2205,2291,2297,2366,2386,2392,2398,2403,2451,2541,2547,2594,2654,2659,2724,3017,3029,3035,3040,3325,3331,3637,3643,3648,3840,3846,3910],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"collectionview-net-maui",[48],{"type":49,"value":50},"text","CollectionView — .NET MAUI",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55,62,64,70,72,78],{"type":43,"tag":56,"props":57,"children":59},"code",{"className":58},[],[60],{"type":49,"value":61},"CollectionView",{"type":49,"value":63}," is the primary control for displaying scrollable lists and grids of data in .NET MAUI. It replaces ",{"type":43,"tag":56,"props":65,"children":67},{"className":66},[],[68],{"type":49,"value":69},"ListView",{"type":49,"value":71}," with better performance, flexible layouts, and no ",{"type":43,"tag":56,"props":73,"children":75},{"className":74},[],[76],{"type":49,"value":77},"ViewCell",{"type":49,"value":79}," requirement.",{"type":43,"tag":81,"props":82,"children":84},"h2",{"id":83},"when-to-use",[85],{"type":49,"value":86},"When to Use",{"type":43,"tag":88,"props":89,"children":90},"ul",{},[91,97,102,107,112,117],{"type":43,"tag":92,"props":93,"children":94},"li",{},[95],{"type":49,"value":96},"Displaying a scrollable list or grid of data items",{"type":43,"tag":92,"props":98,"children":99},{},[100],{"type":49,"value":101},"Binding a collection of objects to a templated item layout",{"type":43,"tag":92,"props":103,"children":104},{},[105],{"type":49,"value":106},"Adding selection (single or multiple), grouping, or pull-to-refresh",{"type":43,"tag":92,"props":108,"children":109},{},[110],{"type":49,"value":111},"Implementing infinite scroll \u002F incremental loading",{"type":43,"tag":92,"props":113,"children":114},{},[115],{"type":49,"value":116},"Showing swipe actions on list items",{"type":43,"tag":92,"props":118,"children":119},{},[120],{"type":49,"value":121},"Displaying an empty state when no data is available",{"type":43,"tag":81,"props":123,"children":125},{"id":124},"when-not-to-use",[126],{"type":49,"value":127},"When Not to Use",{"type":43,"tag":88,"props":129,"children":130},{},[131,152,165,170],{"type":43,"tag":92,"props":132,"children":133},{},[134,136,142,144,150],{"type":49,"value":135},"Static layouts with a fixed number of items — use ",{"type":43,"tag":56,"props":137,"children":139},{"className":138},[],[140],{"type":49,"value":141},"Grid",{"type":49,"value":143}," or ",{"type":43,"tag":56,"props":145,"children":147},{"className":146},[],[148],{"type":49,"value":149},"StackLayout",{"type":49,"value":151}," directly",{"type":43,"tag":92,"props":153,"children":154},{},[155,157,163],{"type":49,"value":156},"Map pin lists — use the ",{"type":43,"tag":56,"props":158,"children":160},{"className":159},[],[161],{"type":49,"value":162},"Microsoft.Maui.Controls.Maps",{"type":49,"value":164}," NuGet package",{"type":43,"tag":92,"props":166,"children":167},{},[168],{"type":49,"value":169},"Table-based data entry forms — use standard form controls",{"type":43,"tag":92,"props":171,"children":172},{},[173,175,181,183],{"type":49,"value":174},"Simple text-only lists with no interaction — consider ",{"type":43,"tag":56,"props":176,"children":178},{"className":177},[],[179],{"type":49,"value":180},"BindableLayout",{"type":49,"value":182}," on a ",{"type":43,"tag":56,"props":184,"children":186},{"className":185},[],[187],{"type":49,"value":149},{"type":43,"tag":81,"props":189,"children":191},{"id":190},"scope-control-answer-only-what-was-asked",[192],{"type":49,"value":193},"Scope Control — Answer Only What Was Asked",{"type":43,"tag":52,"props":195,"children":196},{},[197,199,205],{"type":49,"value":198},"This skill is a ",{"type":43,"tag":200,"props":201,"children":202},"strong",{},[203],{"type":49,"value":204},"reference you consult",{"type":49,"value":206},", not a checklist you apply. Most requests\nneed one or two sections from it. Pulling in the rest makes the answer worse.",{"type":43,"tag":52,"props":208,"children":209},{},[210],{"type":43,"tag":200,"props":211,"children":212},{},[213],{"type":49,"value":214},"Stop conditions — do NOT act when:",{"type":43,"tag":88,"props":216,"children":217},{},[218,228,238,248,318],{"type":43,"tag":92,"props":219,"children":220},{},[221,226],{"type":43,"tag":200,"props":222,"children":223},{},[224],{"type":49,"value":225},"The user asked a narrow question.",{"type":49,"value":227}," Answer that question only. Do not append\ngrouping, swipe actions, empty views, snap points, or performance tips that\nwere not asked about.",{"type":43,"tag":92,"props":229,"children":230},{},[231,236],{"type":43,"tag":200,"props":232,"children":233},{},[234],{"type":49,"value":235},"The user's existing code already works.",{"type":49,"value":237}," Do not rewrite working markup to\nmatch the examples here. Point out a concrete defect; if there is none, say so\nand answer the question that was asked.",{"type":43,"tag":92,"props":239,"children":240},{},[241,246],{"type":43,"tag":200,"props":242,"children":243},{},[244],{"type":49,"value":245},"The change is stylistic.",{"type":49,"value":247}," Renaming, reordering attributes, or restructuring\na template that already behaves correctly is churn, not a fix.",{"type":43,"tag":92,"props":249,"children":250},{},[251,263,265,271,273,278,280,285,287,292,294,300,302,307,309,316],{"type":43,"tag":200,"props":252,"children":253},{},[254,256,261],{"type":49,"value":255},"The control isn't ",{"type":43,"tag":56,"props":257,"children":259},{"className":258},[],[260],{"type":49,"value":61},{"type":49,"value":262},".",{"type":49,"value":264}," ",{"type":43,"tag":56,"props":266,"children":268},{"className":267},[],[269],{"type":49,"value":270},"CarouselView",{"type":49,"value":272},", ",{"type":43,"tag":56,"props":274,"children":276},{"className":275},[],[277],{"type":49,"value":180},{"type":49,"value":279},", and\n",{"type":43,"tag":56,"props":281,"children":283},{"className":282},[],[284],{"type":49,"value":69},{"type":49,"value":286},"-in-maintenance code have different rules. Do not rewrite ",{"type":43,"tag":56,"props":288,"children":290},{"className":289},[],[291],{"type":49,"value":69},{"type":49,"value":293},"\ncode the user did not ask about — but if they ask ",{"type":43,"tag":295,"props":296,"children":297},"em",{},[298],{"type":49,"value":299},"which",{"type":49,"value":301}," control to use, or are\nmigrating from Xamarin.Forms, recommend ",{"type":43,"tag":56,"props":303,"children":305},{"className":304},[],[306],{"type":49,"value":61},{"type":49,"value":308}," (see\n",{"type":43,"tag":310,"props":311,"children":313},"a",{"href":312},"#migrating-from-listview",[314],{"type":49,"value":315},"Migrating from ListView",{"type":49,"value":317},").",{"type":43,"tag":92,"props":319,"children":320},{},[321,326,328,334,335,341,343,349],{"type":43,"tag":200,"props":322,"children":323},{},[324],{"type":49,"value":325},"The problem is really a binding, DI, or navigation problem",{"type":49,"value":327}," that happens to\ninvolve a list — defer to ",{"type":43,"tag":56,"props":329,"children":331},{"className":330},[],[332],{"type":49,"value":333},"maui-data-binding",{"type":49,"value":272},{"type":43,"tag":56,"props":336,"children":338},{"className":337},[],[339],{"type":49,"value":340},"maui-dependency-injection",{"type":49,"value":342},", or\n",{"type":43,"tag":56,"props":344,"children":346},{"className":345},[],[347],{"type":49,"value":348},"maui-shell-navigation",{"type":49,"value":262},{"type":43,"tag":52,"props":351,"children":352},{},[353,358],{"type":43,"tag":200,"props":354,"children":355},{},[356],{"type":49,"value":357},"The API sections below are a reference, not a checklist — offer them only when\nrelevant.",{"type":49,"value":359}," Four rules are non-negotiable, because violating them produces code that\ndoes not work or silently loses compile-time checking:",{"type":43,"tag":361,"props":362,"children":363},"ol",{},[364,390,403,408],{"type":43,"tag":92,"props":365,"children":366},{},[367,369,374,376,382,384,389],{"type":49,"value":368},"Never use ",{"type":43,"tag":56,"props":370,"children":372},{"className":371},[],[373],{"type":49,"value":77},{"type":49,"value":375}," as a ",{"type":43,"tag":56,"props":377,"children":379},{"className":378},[],[380],{"type":49,"value":381},"DataTemplate",{"type":49,"value":383}," root in ",{"type":43,"tag":56,"props":385,"children":387},{"className":386},[],[388],{"type":49,"value":61},{"type":49,"value":262},{"type":43,"tag":92,"props":391,"children":392},{},[393,395,401],{"type":49,"value":394},"Use ",{"type":43,"tag":56,"props":396,"children":398},{"className":397},[],[399],{"type":49,"value":400},"ObservableCollection\u003CT>",{"type":49,"value":402}," when the list mutates after first render.",{"type":43,"tag":92,"props":404,"children":405},{},[406],{"type":49,"value":407},"Mutate the bound collection on the UI thread.",{"type":43,"tag":92,"props":409,"children":410},{},[411,413,419,421,426],{"type":49,"value":412},"Set ",{"type":43,"tag":56,"props":414,"children":416},{"className":415},[],[417],{"type":49,"value":418},"x:DataType",{"type":49,"value":420}," on every ",{"type":43,"tag":56,"props":422,"children":424},{"className":423},[],[425],{"type":49,"value":381},{"type":49,"value":427}," (and on the page root) for compiled bindings.",{"type":43,"tag":52,"props":429,"children":430},{},[431],{"type":49,"value":432},"Everything else — sizing strategy, snap points, header\u002Ffooter, empty views — is\noptional and should be offered only when it addresses the user's actual problem.",{"type":43,"tag":81,"props":434,"children":436},{"id":435},"inputs",[437],{"type":49,"value":438},"Inputs",{"type":43,"tag":88,"props":440,"children":441},{},[442,460,472],{"type":43,"tag":92,"props":443,"children":444},{},[445,447,452,454],{"type":49,"value":446},"A data source (typically ",{"type":43,"tag":56,"props":448,"children":450},{"className":449},[],[451],{"type":49,"value":400},{"type":49,"value":453},") bound to ",{"type":43,"tag":56,"props":455,"children":457},{"className":456},[],[458],{"type":49,"value":459},"ItemsSource",{"type":43,"tag":92,"props":461,"children":462},{},[463,465,470],{"type":49,"value":464},"A ",{"type":43,"tag":56,"props":466,"children":468},{"className":467},[],[469],{"type":49,"value":381},{"type":49,"value":471}," defining how each item renders",{"type":43,"tag":92,"props":473,"children":474},{},[475],{"type":49,"value":476},"Optional: layout configuration, selection mode, grouping model, empty view",{"type":43,"tag":81,"props":478,"children":480},{"id":479},"basic-setup",[481],{"type":49,"value":482},"Basic Setup",{"type":43,"tag":52,"props":484,"children":485},{},[486,488,494,496,502,504,514,516,521],{"type":49,"value":487},"A complete, copy-pasteable page. Two things are load-bearing: the ",{"type":43,"tag":56,"props":489,"children":491},{"className":490},[],[492],{"type":49,"value":493},"xmlns:models",{"type":49,"value":495},"\ndeclaration that every ",{"type":43,"tag":56,"props":497,"children":499},{"className":498},[],[500],{"type":49,"value":501},"x:DataType=\"models:Item\"",{"type":49,"value":503}," in this skill assumes, and the\n",{"type":43,"tag":200,"props":505,"children":506},{},[507,509],{"type":49,"value":508},"root ",{"type":43,"tag":56,"props":510,"children":512},{"className":511},[],[513],{"type":49,"value":418},{"type":49,"value":515}," — without it the outer ",{"type":43,"tag":56,"props":517,"children":519},{"className":518},[],[520],{"type":49,"value":459},{"type":49,"value":522}," binding is not compiled:",{"type":43,"tag":524,"props":525,"children":530},"pre",{"className":526,"code":527,"language":528,"meta":529,"style":529},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003CContentPage xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdotnet\u002F2021\u002Fmaui\"\n             xmlns:x=\"http:\u002F\u002Fschemas.microsoft.com\u002Fwinfx\u002F2009\u002Fxaml\"\n             xmlns:models=\"clr-namespace:MyApp.Models\"\n             xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n             x:DataType=\"vm:ItemsViewModel\"\n             x:Class=\"MyApp.ItemsPage\">\n    \u003CContentPage.BindingContext>\n        \u003Cvm:ItemsViewModel \u002F>\n    \u003C\u002FContentPage.BindingContext>\n    \u003CCollectionView ItemsSource=\"{Binding Items}\">\n        \u003CCollectionView.ItemTemplate>\n            \u003CDataTemplate x:DataType=\"models:Item\">\n                \u003CHorizontalStackLayout Padding=\"8\" Spacing=\"8\">\n                    \u003CImage Source=\"{Binding Icon}\" WidthRequest=\"40\" HeightRequest=\"40\" \u002F>\n                    \u003CLabel Text=\"{Binding Name}\" VerticalOptions=\"Center\" \u002F>\n                \u003C\u002FHorizontalStackLayout>\n            \u003C\u002FDataTemplate>\n        \u003C\u002FCollectionView.ItemTemplate>\n    \u003C\u002FCollectionView>\n\u003C\u002FContentPage>\n","xml","",[531],{"type":43,"tag":56,"props":532,"children":533},{"__ignoreMap":529},[534,545,554,563,572,581,590,599,608,617,626,635,644,653,662,671,680,689,698,707],{"type":43,"tag":535,"props":536,"children":539},"span",{"class":537,"line":538},"line",1,[540],{"type":43,"tag":535,"props":541,"children":542},{},[543],{"type":49,"value":544},"\u003CContentPage xmlns=\"http:\u002F\u002Fschemas.microsoft.com\u002Fdotnet\u002F2021\u002Fmaui\"\n",{"type":43,"tag":535,"props":546,"children":548},{"class":537,"line":547},2,[549],{"type":43,"tag":535,"props":550,"children":551},{},[552],{"type":49,"value":553},"             xmlns:x=\"http:\u002F\u002Fschemas.microsoft.com\u002Fwinfx\u002F2009\u002Fxaml\"\n",{"type":43,"tag":535,"props":555,"children":557},{"class":537,"line":556},3,[558],{"type":43,"tag":535,"props":559,"children":560},{},[561],{"type":49,"value":562},"             xmlns:models=\"clr-namespace:MyApp.Models\"\n",{"type":43,"tag":535,"props":564,"children":566},{"class":537,"line":565},4,[567],{"type":43,"tag":535,"props":568,"children":569},{},[570],{"type":49,"value":571},"             xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n",{"type":43,"tag":535,"props":573,"children":575},{"class":537,"line":574},5,[576],{"type":43,"tag":535,"props":577,"children":578},{},[579],{"type":49,"value":580},"             x:DataType=\"vm:ItemsViewModel\"\n",{"type":43,"tag":535,"props":582,"children":584},{"class":537,"line":583},6,[585],{"type":43,"tag":535,"props":586,"children":587},{},[588],{"type":49,"value":589},"             x:Class=\"MyApp.ItemsPage\">\n",{"type":43,"tag":535,"props":591,"children":593},{"class":537,"line":592},7,[594],{"type":43,"tag":535,"props":595,"children":596},{},[597],{"type":49,"value":598},"    \u003CContentPage.BindingContext>\n",{"type":43,"tag":535,"props":600,"children":602},{"class":537,"line":601},8,[603],{"type":43,"tag":535,"props":604,"children":605},{},[606],{"type":49,"value":607},"        \u003Cvm:ItemsViewModel \u002F>\n",{"type":43,"tag":535,"props":609,"children":611},{"class":537,"line":610},9,[612],{"type":43,"tag":535,"props":613,"children":614},{},[615],{"type":49,"value":616},"    \u003C\u002FContentPage.BindingContext>\n",{"type":43,"tag":535,"props":618,"children":620},{"class":537,"line":619},10,[621],{"type":43,"tag":535,"props":622,"children":623},{},[624],{"type":49,"value":625},"    \u003CCollectionView ItemsSource=\"{Binding Items}\">\n",{"type":43,"tag":535,"props":627,"children":629},{"class":537,"line":628},11,[630],{"type":43,"tag":535,"props":631,"children":632},{},[633],{"type":49,"value":634},"        \u003CCollectionView.ItemTemplate>\n",{"type":43,"tag":535,"props":636,"children":638},{"class":537,"line":637},12,[639],{"type":43,"tag":535,"props":640,"children":641},{},[642],{"type":49,"value":643},"            \u003CDataTemplate x:DataType=\"models:Item\">\n",{"type":43,"tag":535,"props":645,"children":647},{"class":537,"line":646},13,[648],{"type":43,"tag":535,"props":649,"children":650},{},[651],{"type":49,"value":652},"                \u003CHorizontalStackLayout Padding=\"8\" Spacing=\"8\">\n",{"type":43,"tag":535,"props":654,"children":656},{"class":537,"line":655},14,[657],{"type":43,"tag":535,"props":658,"children":659},{},[660],{"type":49,"value":661},"                    \u003CImage Source=\"{Binding Icon}\" WidthRequest=\"40\" HeightRequest=\"40\" \u002F>\n",{"type":43,"tag":535,"props":663,"children":665},{"class":537,"line":664},15,[666],{"type":43,"tag":535,"props":667,"children":668},{},[669],{"type":49,"value":670},"                    \u003CLabel Text=\"{Binding Name}\" VerticalOptions=\"Center\" \u002F>\n",{"type":43,"tag":535,"props":672,"children":674},{"class":537,"line":673},16,[675],{"type":43,"tag":535,"props":676,"children":677},{},[678],{"type":49,"value":679},"                \u003C\u002FHorizontalStackLayout>\n",{"type":43,"tag":535,"props":681,"children":683},{"class":537,"line":682},17,[684],{"type":43,"tag":535,"props":685,"children":686},{},[687],{"type":49,"value":688},"            \u003C\u002FDataTemplate>\n",{"type":43,"tag":535,"props":690,"children":692},{"class":537,"line":691},18,[693],{"type":43,"tag":535,"props":694,"children":695},{},[696],{"type":49,"value":697},"        \u003C\u002FCollectionView.ItemTemplate>\n",{"type":43,"tag":535,"props":699,"children":701},{"class":537,"line":700},19,[702],{"type":43,"tag":535,"props":703,"children":704},{},[705],{"type":49,"value":706},"    \u003C\u002FCollectionView>\n",{"type":43,"tag":535,"props":708,"children":710},{"class":537,"line":709},20,[711],{"type":43,"tag":535,"props":712,"children":713},{},[714],{"type":49,"value":715},"\u003C\u002FContentPage>\n",{"type":43,"tag":52,"props":717,"children":718},{},[719,721,726,728,734],{"type":49,"value":720},"Later snippets show only the ",{"type":43,"tag":56,"props":722,"children":724},{"className":723},[],[725],{"type":49,"value":61},{"type":49,"value":727}," element. When you hand a snippet to a\nuser, include the matching ",{"type":43,"tag":56,"props":729,"children":731},{"className":730},[],[732],{"type":49,"value":733},"xmlns:",{"type":49,"value":735}," declaration for any prefix it uses, or the XAML\nwill not compile.",{"type":43,"tag":52,"props":737,"children":738},{},[739,741,747,749,755,757,761],{"type":49,"value":740},"The inline ",{"type":43,"tag":56,"props":742,"children":744},{"className":743},[],[745],{"type":49,"value":746},"\u003CContentPage.BindingContext>",{"type":49,"value":748}," above keeps the example self-contained. In\nan app that uses dependency injection, register the ViewModel instead and assign it\nthrough constructor injection (",{"type":43,"tag":56,"props":750,"children":752},{"className":751},[],[753],{"type":49,"value":754},"BindingContext = vm;",{"type":49,"value":756},") — see the\n",{"type":43,"tag":200,"props":758,"children":759},{},[760],{"type":49,"value":340},{"type":49,"value":762}," skill.",{"type":43,"tag":52,"props":764,"children":765},{},[766],{"type":43,"tag":200,"props":767,"children":768},{},[769],{"type":49,"value":770},"Key rules:",{"type":43,"tag":88,"props":772,"children":773},{},[774,793,824],{"type":43,"tag":92,"props":775,"children":776},{},[777,779,784,786,791],{"type":49,"value":778},"Bind ",{"type":43,"tag":56,"props":780,"children":782},{"className":781},[],[783],{"type":49,"value":459},{"type":49,"value":785}," to an ",{"type":43,"tag":56,"props":787,"children":789},{"className":788},[],[790],{"type":49,"value":400},{"type":49,"value":792}," so the UI updates on add\u002Fremove.",{"type":43,"tag":92,"props":794,"children":795},{},[796,798,804,805,811,813,823],{"type":49,"value":797},"Each item template root must be a ",{"type":43,"tag":56,"props":799,"children":801},{"className":800},[],[802],{"type":49,"value":803},"Layout",{"type":49,"value":143},{"type":43,"tag":56,"props":806,"children":808},{"className":807},[],[809],{"type":49,"value":810},"View",{"type":49,"value":812}," — ",{"type":43,"tag":200,"props":814,"children":815},{},[816,818],{"type":49,"value":817},"never use ",{"type":43,"tag":56,"props":819,"children":821},{"className":820},[],[822],{"type":49,"value":77},{"type":49,"value":262},{"type":43,"tag":92,"props":825,"children":826},{},[827,829,834,836,841],{"type":49,"value":828},"Always set ",{"type":43,"tag":56,"props":830,"children":832},{"className":831},[],[833],{"type":49,"value":418},{"type":49,"value":835}," on ",{"type":43,"tag":56,"props":837,"children":839},{"className":838},[],[840],{"type":49,"value":381},{"type":49,"value":842}," for compiled bindings.",{"type":43,"tag":81,"props":844,"children":846},{"id":845},"layouts",[847],{"type":49,"value":848},"Layouts",{"type":43,"tag":52,"props":850,"children":851},{},[852,853,859,861,867],{"type":49,"value":412},{"type":43,"tag":56,"props":854,"children":856},{"className":855},[],[857],{"type":49,"value":858},"ItemsLayout",{"type":49,"value":860}," to control arrangement. Default is ",{"type":43,"tag":56,"props":862,"children":864},{"className":863},[],[865],{"type":49,"value":866},"VerticalList",{"type":49,"value":262},{"type":43,"tag":869,"props":870,"children":871},"table",{},[872,890],{"type":43,"tag":873,"props":874,"children":875},"thead",{},[876],{"type":43,"tag":877,"props":878,"children":879},"tr",{},[880,885],{"type":43,"tag":881,"props":882,"children":883},"th",{},[884],{"type":49,"value":803},{"type":43,"tag":881,"props":886,"children":887},{},[888],{"type":49,"value":889},"XAML value",{"type":43,"tag":891,"props":892,"children":893},"tbody",{},[894,913,930,955],{"type":43,"tag":877,"props":895,"children":896},{},[897,903],{"type":43,"tag":898,"props":899,"children":900},"td",{},[901],{"type":49,"value":902},"Vertical list",{"type":43,"tag":898,"props":904,"children":905},{},[906,911],{"type":43,"tag":56,"props":907,"children":909},{"className":908},[],[910],{"type":49,"value":866},{"type":49,"value":912}," (default)",{"type":43,"tag":877,"props":914,"children":915},{},[916,921],{"type":43,"tag":898,"props":917,"children":918},{},[919],{"type":49,"value":920},"Horizontal list",{"type":43,"tag":898,"props":922,"children":923},{},[924],{"type":43,"tag":56,"props":925,"children":927},{"className":926},[],[928],{"type":49,"value":929},"HorizontalList",{"type":43,"tag":877,"props":931,"children":932},{},[933,938],{"type":43,"tag":898,"props":934,"children":935},{},[936],{"type":49,"value":937},"Vertical grid",{"type":43,"tag":898,"props":939,"children":940},{},[941,947,949],{"type":43,"tag":56,"props":942,"children":944},{"className":943},[],[945],{"type":49,"value":946},"GridItemsLayout",{"type":49,"value":948}," with ",{"type":43,"tag":56,"props":950,"children":952},{"className":951},[],[953],{"type":49,"value":954},"Orientation=\"Vertical\"",{"type":43,"tag":877,"props":956,"children":957},{},[958,963],{"type":43,"tag":898,"props":959,"children":960},{},[961],{"type":49,"value":962},"Horizontal grid",{"type":43,"tag":898,"props":964,"children":965},{},[966,971,972],{"type":43,"tag":56,"props":967,"children":969},{"className":968},[],[970],{"type":49,"value":946},{"type":49,"value":948},{"type":43,"tag":56,"props":973,"children":975},{"className":974},[],[976],{"type":49,"value":977},"Orientation=\"Horizontal\"",{"type":43,"tag":979,"props":980,"children":982},"h3",{"id":981},"grid-layout",[983],{"type":49,"value":984},"Grid Layout",{"type":43,"tag":524,"props":986,"children":988},{"className":526,"code":987,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding Items}\">\n    \u003CCollectionView.ItemsLayout>\n        \u003CGridItemsLayout Orientation=\"Vertical\"\n                         Span=\"2\"\n                         VerticalItemSpacing=\"8\"\n                         HorizontalItemSpacing=\"8\" \u002F>\n    \u003C\u002FCollectionView.ItemsLayout>\n    \u003CCollectionView.ItemTemplate>\n        \u003CDataTemplate x:DataType=\"models:Item\">\n            \u003CBorder Padding=\"8\" StrokeThickness=\"0\">\n                \u003CVerticalStackLayout>\n                    \u003CImage Source=\"{Binding Image}\" HeightRequest=\"120\" Aspect=\"AspectFill\" \u002F>\n                    \u003CLabel Text=\"{Binding Name}\" FontAttributes=\"Bold\" \u002F>\n                \u003C\u002FVerticalStackLayout>\n            \u003C\u002FBorder>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.ItemTemplate>\n\u003C\u002FCollectionView>\n",[989],{"type":43,"tag":56,"props":990,"children":991},{"__ignoreMap":529},[992,1000,1008,1016,1024,1032,1040,1048,1056,1064,1072,1080,1088,1096,1104,1112,1120,1128],{"type":43,"tag":535,"props":993,"children":994},{"class":537,"line":538},[995],{"type":43,"tag":535,"props":996,"children":997},{},[998],{"type":49,"value":999},"\u003CCollectionView ItemsSource=\"{Binding Items}\">\n",{"type":43,"tag":535,"props":1001,"children":1002},{"class":537,"line":547},[1003],{"type":43,"tag":535,"props":1004,"children":1005},{},[1006],{"type":49,"value":1007},"    \u003CCollectionView.ItemsLayout>\n",{"type":43,"tag":535,"props":1009,"children":1010},{"class":537,"line":556},[1011],{"type":43,"tag":535,"props":1012,"children":1013},{},[1014],{"type":49,"value":1015},"        \u003CGridItemsLayout Orientation=\"Vertical\"\n",{"type":43,"tag":535,"props":1017,"children":1018},{"class":537,"line":565},[1019],{"type":43,"tag":535,"props":1020,"children":1021},{},[1022],{"type":49,"value":1023},"                         Span=\"2\"\n",{"type":43,"tag":535,"props":1025,"children":1026},{"class":537,"line":574},[1027],{"type":43,"tag":535,"props":1028,"children":1029},{},[1030],{"type":49,"value":1031},"                         VerticalItemSpacing=\"8\"\n",{"type":43,"tag":535,"props":1033,"children":1034},{"class":537,"line":583},[1035],{"type":43,"tag":535,"props":1036,"children":1037},{},[1038],{"type":49,"value":1039},"                         HorizontalItemSpacing=\"8\" \u002F>\n",{"type":43,"tag":535,"props":1041,"children":1042},{"class":537,"line":592},[1043],{"type":43,"tag":535,"props":1044,"children":1045},{},[1046],{"type":49,"value":1047},"    \u003C\u002FCollectionView.ItemsLayout>\n",{"type":43,"tag":535,"props":1049,"children":1050},{"class":537,"line":601},[1051],{"type":43,"tag":535,"props":1052,"children":1053},{},[1054],{"type":49,"value":1055},"    \u003CCollectionView.ItemTemplate>\n",{"type":43,"tag":535,"props":1057,"children":1058},{"class":537,"line":610},[1059],{"type":43,"tag":535,"props":1060,"children":1061},{},[1062],{"type":49,"value":1063},"        \u003CDataTemplate x:DataType=\"models:Item\">\n",{"type":43,"tag":535,"props":1065,"children":1066},{"class":537,"line":619},[1067],{"type":43,"tag":535,"props":1068,"children":1069},{},[1070],{"type":49,"value":1071},"            \u003CBorder Padding=\"8\" StrokeThickness=\"0\">\n",{"type":43,"tag":535,"props":1073,"children":1074},{"class":537,"line":628},[1075],{"type":43,"tag":535,"props":1076,"children":1077},{},[1078],{"type":49,"value":1079},"                \u003CVerticalStackLayout>\n",{"type":43,"tag":535,"props":1081,"children":1082},{"class":537,"line":637},[1083],{"type":43,"tag":535,"props":1084,"children":1085},{},[1086],{"type":49,"value":1087},"                    \u003CImage Source=\"{Binding Image}\" HeightRequest=\"120\" Aspect=\"AspectFill\" \u002F>\n",{"type":43,"tag":535,"props":1089,"children":1090},{"class":537,"line":646},[1091],{"type":43,"tag":535,"props":1092,"children":1093},{},[1094],{"type":49,"value":1095},"                    \u003CLabel Text=\"{Binding Name}\" FontAttributes=\"Bold\" \u002F>\n",{"type":43,"tag":535,"props":1097,"children":1098},{"class":537,"line":655},[1099],{"type":43,"tag":535,"props":1100,"children":1101},{},[1102],{"type":49,"value":1103},"                \u003C\u002FVerticalStackLayout>\n",{"type":43,"tag":535,"props":1105,"children":1106},{"class":537,"line":664},[1107],{"type":43,"tag":535,"props":1108,"children":1109},{},[1110],{"type":49,"value":1111},"            \u003C\u002FBorder>\n",{"type":43,"tag":535,"props":1113,"children":1114},{"class":537,"line":673},[1115],{"type":43,"tag":535,"props":1116,"children":1117},{},[1118],{"type":49,"value":1119},"        \u003C\u002FDataTemplate>\n",{"type":43,"tag":535,"props":1121,"children":1122},{"class":537,"line":682},[1123],{"type":43,"tag":535,"props":1124,"children":1125},{},[1126],{"type":49,"value":1127},"    \u003C\u002FCollectionView.ItemTemplate>\n",{"type":43,"tag":535,"props":1129,"children":1130},{"class":537,"line":691},[1131],{"type":43,"tag":535,"props":1132,"children":1133},{},[1134],{"type":49,"value":1135},"\u003C\u002FCollectionView>\n",{"type":43,"tag":979,"props":1137,"children":1139},{"id":1138},"horizontal-list",[1140],{"type":49,"value":1141},"Horizontal List",{"type":43,"tag":524,"props":1143,"children":1145},{"className":526,"code":1144,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding Items}\"\n                ItemsLayout=\"HorizontalList\" \u002F>\n",[1146],{"type":43,"tag":56,"props":1147,"children":1148},{"__ignoreMap":529},[1149,1157],{"type":43,"tag":535,"props":1150,"children":1151},{"class":537,"line":538},[1152],{"type":43,"tag":535,"props":1153,"children":1154},{},[1155],{"type":49,"value":1156},"\u003CCollectionView ItemsSource=\"{Binding Items}\"\n",{"type":43,"tag":535,"props":1158,"children":1159},{"class":537,"line":547},[1160],{"type":43,"tag":535,"props":1161,"children":1162},{},[1163],{"type":49,"value":1164},"                ItemsLayout=\"HorizontalList\" \u002F>\n",{"type":43,"tag":81,"props":1166,"children":1168},{"id":1167},"selection",[1169],{"type":49,"value":1170},"Selection",{"type":43,"tag":979,"props":1172,"children":1174},{"id":1173},"selection-mode",[1175],{"type":49,"value":1176},"Selection Mode",{"type":43,"tag":869,"props":1178,"children":1179},{},[1180,1201],{"type":43,"tag":873,"props":1181,"children":1182},{},[1183],{"type":43,"tag":877,"props":1184,"children":1185},{},[1186,1191,1196],{"type":43,"tag":881,"props":1187,"children":1188},{},[1189],{"type":49,"value":1190},"Mode",{"type":43,"tag":881,"props":1192,"children":1193},{},[1194],{"type":49,"value":1195},"Property to bind",{"type":43,"tag":881,"props":1197,"children":1198},{},[1199],{"type":49,"value":1200},"Binding mode",{"type":43,"tag":891,"props":1202,"children":1203},{},[1204,1225,1255],{"type":43,"tag":877,"props":1205,"children":1206},{},[1207,1216,1221],{"type":43,"tag":898,"props":1208,"children":1209},{},[1210],{"type":43,"tag":56,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":49,"value":1215},"None",{"type":43,"tag":898,"props":1217,"children":1218},{},[1219],{"type":49,"value":1220},"—",{"type":43,"tag":898,"props":1222,"children":1223},{},[1224],{"type":49,"value":1220},{"type":43,"tag":877,"props":1226,"children":1227},{},[1228,1237,1246],{"type":43,"tag":898,"props":1229,"children":1230},{},[1231],{"type":43,"tag":56,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":49,"value":1236},"Single",{"type":43,"tag":898,"props":1238,"children":1239},{},[1240],{"type":43,"tag":56,"props":1241,"children":1243},{"className":1242},[],[1244],{"type":49,"value":1245},"SelectedItem",{"type":43,"tag":898,"props":1247,"children":1248},{},[1249],{"type":43,"tag":56,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":49,"value":1254},"TwoWay",{"type":43,"tag":877,"props":1256,"children":1257},{},[1258,1267,1276],{"type":43,"tag":898,"props":1259,"children":1260},{},[1261],{"type":43,"tag":56,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":49,"value":1266},"Multiple",{"type":43,"tag":898,"props":1268,"children":1269},{},[1270],{"type":43,"tag":56,"props":1271,"children":1273},{"className":1272},[],[1274],{"type":49,"value":1275},"SelectedItems",{"type":43,"tag":898,"props":1277,"children":1278},{},[1279],{"type":43,"tag":56,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":49,"value":1284},"OneWay",{"type":43,"tag":524,"props":1286,"children":1288},{"className":526,"code":1287,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding Items}\"\n                SelectionMode=\"Single\"\n                SelectedItem=\"{Binding CurrentItem, Mode=TwoWay}\"\n                SelectionChangedCommand=\"{Binding ItemSelectedCommand}\" \u002F>\n",[1289],{"type":43,"tag":56,"props":1290,"children":1291},{"__ignoreMap":529},[1292,1299,1307,1315],{"type":43,"tag":535,"props":1293,"children":1294},{"class":537,"line":538},[1295],{"type":43,"tag":535,"props":1296,"children":1297},{},[1298],{"type":49,"value":1156},{"type":43,"tag":535,"props":1300,"children":1301},{"class":537,"line":547},[1302],{"type":43,"tag":535,"props":1303,"children":1304},{},[1305],{"type":49,"value":1306},"                SelectionMode=\"Single\"\n",{"type":43,"tag":535,"props":1308,"children":1309},{"class":537,"line":556},[1310],{"type":43,"tag":535,"props":1311,"children":1312},{},[1313],{"type":49,"value":1314},"                SelectedItem=\"{Binding CurrentItem, Mode=TwoWay}\"\n",{"type":43,"tag":535,"props":1316,"children":1317},{"class":537,"line":565},[1318],{"type":43,"tag":535,"props":1319,"children":1320},{},[1321],{"type":49,"value":1322},"                SelectionChangedCommand=\"{Binding ItemSelectedCommand}\" \u002F>\n",{"type":43,"tag":52,"props":1324,"children":1325},{},[1326,1328,1333,1335,1340,1342,1348],{"type":49,"value":1327},"For ",{"type":43,"tag":56,"props":1329,"children":1331},{"className":1330},[],[1332],{"type":49,"value":1266},{"type":49,"value":1334}," selection, bind ",{"type":43,"tag":56,"props":1336,"children":1338},{"className":1337},[],[1339],{"type":49,"value":1275},{"type":49,"value":1341}," (type ",{"type":43,"tag":56,"props":1343,"children":1345},{"className":1344},[],[1346],{"type":49,"value":1347},"IList\u003Cobject>",{"type":49,"value":1349},"):",{"type":43,"tag":524,"props":1351,"children":1353},{"className":526,"code":1352,"language":528,"meta":529,"style":529},"\u003CCollectionView SelectionMode=\"Multiple\"\n                SelectedItems=\"{Binding ChosenItems, Mode=OneWay}\" \u002F>\n",[1354],{"type":43,"tag":56,"props":1355,"children":1356},{"__ignoreMap":529},[1357,1365],{"type":43,"tag":535,"props":1358,"children":1359},{"class":537,"line":538},[1360],{"type":43,"tag":535,"props":1361,"children":1362},{},[1363],{"type":49,"value":1364},"\u003CCollectionView SelectionMode=\"Multiple\"\n",{"type":43,"tag":535,"props":1366,"children":1367},{"class":537,"line":547},[1368],{"type":43,"tag":535,"props":1369,"children":1370},{},[1371],{"type":49,"value":1372},"                SelectedItems=\"{Binding ChosenItems, Mode=OneWay}\" \u002F>\n",{"type":43,"tag":979,"props":1374,"children":1376},{"id":1375},"selected-visual-state",[1377],{"type":49,"value":1378},"Selected Visual State",{"type":43,"tag":52,"props":1380,"children":1381},{},[1382,1384,1390],{"type":49,"value":1383},"Highlight selected items using ",{"type":43,"tag":56,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":49,"value":1389},"VisualStateManager",{"type":49,"value":1391},":",{"type":43,"tag":524,"props":1393,"children":1395},{"className":526,"code":1394,"language":528,"meta":529,"style":529},"\u003CCollectionView.ItemTemplate>\n    \u003CDataTemplate x:DataType=\"models:Item\">\n        \u003CGrid Padding=\"8\">\n            \u003CVisualStateManager.VisualStateGroups>\n                \u003CVisualStateGroup Name=\"CommonStates\">\n                    \u003CVisualState Name=\"Normal\">\n                        \u003CVisualState.Setters>\n                            \u003CSetter Property=\"BackgroundColor\" Value=\"Transparent\" \u002F>\n                        \u003C\u002FVisualState.Setters>\n                    \u003C\u002FVisualState>\n                    \u003CVisualState Name=\"Selected\">\n                        \u003CVisualState.Setters>\n                            \u003CSetter Property=\"BackgroundColor\"\n                                    Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource PrimaryDark}}\" \u002F>\n                        \u003C\u002FVisualState.Setters>\n                    \u003C\u002FVisualState>\n                \u003C\u002FVisualStateGroup>\n            \u003C\u002FVisualStateManager.VisualStateGroups>\n            \u003CLabel Text=\"{Binding Name}\" \u002F>\n        \u003C\u002FGrid>\n    \u003C\u002FDataTemplate>\n\u003C\u002FCollectionView.ItemTemplate>\n",[1396],{"type":43,"tag":56,"props":1397,"children":1398},{"__ignoreMap":529},[1399,1407,1415,1423,1431,1439,1447,1455,1463,1471,1479,1487,1494,1502,1510,1517,1524,1532,1540,1548,1556,1565],{"type":43,"tag":535,"props":1400,"children":1401},{"class":537,"line":538},[1402],{"type":43,"tag":535,"props":1403,"children":1404},{},[1405],{"type":49,"value":1406},"\u003CCollectionView.ItemTemplate>\n",{"type":43,"tag":535,"props":1408,"children":1409},{"class":537,"line":547},[1410],{"type":43,"tag":535,"props":1411,"children":1412},{},[1413],{"type":49,"value":1414},"    \u003CDataTemplate x:DataType=\"models:Item\">\n",{"type":43,"tag":535,"props":1416,"children":1417},{"class":537,"line":556},[1418],{"type":43,"tag":535,"props":1419,"children":1420},{},[1421],{"type":49,"value":1422},"        \u003CGrid Padding=\"8\">\n",{"type":43,"tag":535,"props":1424,"children":1425},{"class":537,"line":565},[1426],{"type":43,"tag":535,"props":1427,"children":1428},{},[1429],{"type":49,"value":1430},"            \u003CVisualStateManager.VisualStateGroups>\n",{"type":43,"tag":535,"props":1432,"children":1433},{"class":537,"line":574},[1434],{"type":43,"tag":535,"props":1435,"children":1436},{},[1437],{"type":49,"value":1438},"                \u003CVisualStateGroup Name=\"CommonStates\">\n",{"type":43,"tag":535,"props":1440,"children":1441},{"class":537,"line":583},[1442],{"type":43,"tag":535,"props":1443,"children":1444},{},[1445],{"type":49,"value":1446},"                    \u003CVisualState Name=\"Normal\">\n",{"type":43,"tag":535,"props":1448,"children":1449},{"class":537,"line":592},[1450],{"type":43,"tag":535,"props":1451,"children":1452},{},[1453],{"type":49,"value":1454},"                        \u003CVisualState.Setters>\n",{"type":43,"tag":535,"props":1456,"children":1457},{"class":537,"line":601},[1458],{"type":43,"tag":535,"props":1459,"children":1460},{},[1461],{"type":49,"value":1462},"                            \u003CSetter Property=\"BackgroundColor\" Value=\"Transparent\" \u002F>\n",{"type":43,"tag":535,"props":1464,"children":1465},{"class":537,"line":610},[1466],{"type":43,"tag":535,"props":1467,"children":1468},{},[1469],{"type":49,"value":1470},"                        \u003C\u002FVisualState.Setters>\n",{"type":43,"tag":535,"props":1472,"children":1473},{"class":537,"line":619},[1474],{"type":43,"tag":535,"props":1475,"children":1476},{},[1477],{"type":49,"value":1478},"                    \u003C\u002FVisualState>\n",{"type":43,"tag":535,"props":1480,"children":1481},{"class":537,"line":628},[1482],{"type":43,"tag":535,"props":1483,"children":1484},{},[1485],{"type":49,"value":1486},"                    \u003CVisualState Name=\"Selected\">\n",{"type":43,"tag":535,"props":1488,"children":1489},{"class":537,"line":637},[1490],{"type":43,"tag":535,"props":1491,"children":1492},{},[1493],{"type":49,"value":1454},{"type":43,"tag":535,"props":1495,"children":1496},{"class":537,"line":646},[1497],{"type":43,"tag":535,"props":1498,"children":1499},{},[1500],{"type":49,"value":1501},"                            \u003CSetter Property=\"BackgroundColor\"\n",{"type":43,"tag":535,"props":1503,"children":1504},{"class":537,"line":655},[1505],{"type":43,"tag":535,"props":1506,"children":1507},{},[1508],{"type":49,"value":1509},"                                    Value=\"{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource PrimaryDark}}\" \u002F>\n",{"type":43,"tag":535,"props":1511,"children":1512},{"class":537,"line":664},[1513],{"type":43,"tag":535,"props":1514,"children":1515},{},[1516],{"type":49,"value":1470},{"type":43,"tag":535,"props":1518,"children":1519},{"class":537,"line":673},[1520],{"type":43,"tag":535,"props":1521,"children":1522},{},[1523],{"type":49,"value":1478},{"type":43,"tag":535,"props":1525,"children":1526},{"class":537,"line":682},[1527],{"type":43,"tag":535,"props":1528,"children":1529},{},[1530],{"type":49,"value":1531},"                \u003C\u002FVisualStateGroup>\n",{"type":43,"tag":535,"props":1533,"children":1534},{"class":537,"line":691},[1535],{"type":43,"tag":535,"props":1536,"children":1537},{},[1538],{"type":49,"value":1539},"            \u003C\u002FVisualStateManager.VisualStateGroups>\n",{"type":43,"tag":535,"props":1541,"children":1542},{"class":537,"line":700},[1543],{"type":43,"tag":535,"props":1544,"children":1545},{},[1546],{"type":49,"value":1547},"            \u003CLabel Text=\"{Binding Name}\" \u002F>\n",{"type":43,"tag":535,"props":1549,"children":1550},{"class":537,"line":709},[1551],{"type":43,"tag":535,"props":1552,"children":1553},{},[1554],{"type":49,"value":1555},"        \u003C\u002FGrid>\n",{"type":43,"tag":535,"props":1557,"children":1559},{"class":537,"line":1558},21,[1560],{"type":43,"tag":535,"props":1561,"children":1562},{},[1563],{"type":49,"value":1564},"    \u003C\u002FDataTemplate>\n",{"type":43,"tag":535,"props":1566,"children":1568},{"class":537,"line":1567},22,[1569],{"type":43,"tag":535,"props":1570,"children":1571},{},[1572],{"type":49,"value":1573},"\u003C\u002FCollectionView.ItemTemplate>\n",{"type":43,"tag":81,"props":1575,"children":1577},{"id":1576},"grouping",[1578],{"type":49,"value":1579},"Grouping",{"type":43,"tag":361,"props":1581,"children":1582},{},[1583],{"type":43,"tag":92,"props":1584,"children":1585},{},[1586,1588,1594],{"type":49,"value":1587},"Create a group class inheriting from ",{"type":43,"tag":56,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":49,"value":1593},"List\u003CT>",{"type":49,"value":1391},{"type":43,"tag":524,"props":1596,"children":1600},{"className":1597,"code":1598,"language":1599,"meta":529,"style":529},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","public class AnimalGroup : List\u003CAnimal>\n{\n    public string Name { get; }\n    public AnimalGroup(string name, List\u003CAnimal> animals) : base(animals)\n    {\n        Name = name;\n    }\n}\n","csharp",[1601],{"type":43,"tag":56,"props":1602,"children":1603},{"__ignoreMap":529},[1604,1612,1620,1628,1636,1644,1652,1660],{"type":43,"tag":535,"props":1605,"children":1606},{"class":537,"line":538},[1607],{"type":43,"tag":535,"props":1608,"children":1609},{},[1610],{"type":49,"value":1611},"public class AnimalGroup : List\u003CAnimal>\n",{"type":43,"tag":535,"props":1613,"children":1614},{"class":537,"line":547},[1615],{"type":43,"tag":535,"props":1616,"children":1617},{},[1618],{"type":49,"value":1619},"{\n",{"type":43,"tag":535,"props":1621,"children":1622},{"class":537,"line":556},[1623],{"type":43,"tag":535,"props":1624,"children":1625},{},[1626],{"type":49,"value":1627},"    public string Name { get; }\n",{"type":43,"tag":535,"props":1629,"children":1630},{"class":537,"line":565},[1631],{"type":43,"tag":535,"props":1632,"children":1633},{},[1634],{"type":49,"value":1635},"    public AnimalGroup(string name, List\u003CAnimal> animals) : base(animals)\n",{"type":43,"tag":535,"props":1637,"children":1638},{"class":537,"line":574},[1639],{"type":43,"tag":535,"props":1640,"children":1641},{},[1642],{"type":49,"value":1643},"    {\n",{"type":43,"tag":535,"props":1645,"children":1646},{"class":537,"line":583},[1647],{"type":43,"tag":535,"props":1648,"children":1649},{},[1650],{"type":49,"value":1651},"        Name = name;\n",{"type":43,"tag":535,"props":1653,"children":1654},{"class":537,"line":592},[1655],{"type":43,"tag":535,"props":1656,"children":1657},{},[1658],{"type":49,"value":1659},"    }\n",{"type":43,"tag":535,"props":1661,"children":1662},{"class":537,"line":601},[1663],{"type":43,"tag":535,"props":1664,"children":1665},{},[1666],{"type":49,"value":1667},"}\n",{"type":43,"tag":361,"props":1669,"children":1670},{"start":547},[1671],{"type":43,"tag":92,"props":1672,"children":1673},{},[1674,1676,1682,1684,1690],{"type":49,"value":1675},"Bind to ",{"type":43,"tag":56,"props":1677,"children":1679},{"className":1678},[],[1680],{"type":49,"value":1681},"ObservableCollection\u003CAnimalGroup>",{"type":49,"value":1683}," and set ",{"type":43,"tag":56,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":49,"value":1689},"IsGrouped=\"True\"",{"type":49,"value":1391},{"type":43,"tag":524,"props":1692,"children":1694},{"className":526,"code":1693,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding AnimalGroups}\"\n                IsGrouped=\"True\">\n    \u003CCollectionView.GroupHeaderTemplate>\n        \u003CDataTemplate x:DataType=\"models:AnimalGroup\">\n            \u003CLabel Text=\"{Binding Name}\"\n                   FontAttributes=\"Bold\"\n                   BackgroundColor=\"{StaticResource Gray100}\"\n                   Padding=\"8\" \u002F>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.GroupHeaderTemplate>\n    \u003CCollectionView.ItemTemplate>\n        \u003CDataTemplate x:DataType=\"models:Animal\">\n            \u003CLabel Text=\"{Binding Name}\" Padding=\"16,4\" \u002F>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.ItemTemplate>\n\u003C\u002FCollectionView>\n",[1695],{"type":43,"tag":56,"props":1696,"children":1697},{"__ignoreMap":529},[1698,1706,1714,1722,1730,1738,1746,1754,1762,1769,1777,1784,1792,1800,1807,1814],{"type":43,"tag":535,"props":1699,"children":1700},{"class":537,"line":538},[1701],{"type":43,"tag":535,"props":1702,"children":1703},{},[1704],{"type":49,"value":1705},"\u003CCollectionView ItemsSource=\"{Binding AnimalGroups}\"\n",{"type":43,"tag":535,"props":1707,"children":1708},{"class":537,"line":547},[1709],{"type":43,"tag":535,"props":1710,"children":1711},{},[1712],{"type":49,"value":1713},"                IsGrouped=\"True\">\n",{"type":43,"tag":535,"props":1715,"children":1716},{"class":537,"line":556},[1717],{"type":43,"tag":535,"props":1718,"children":1719},{},[1720],{"type":49,"value":1721},"    \u003CCollectionView.GroupHeaderTemplate>\n",{"type":43,"tag":535,"props":1723,"children":1724},{"class":537,"line":565},[1725],{"type":43,"tag":535,"props":1726,"children":1727},{},[1728],{"type":49,"value":1729},"        \u003CDataTemplate x:DataType=\"models:AnimalGroup\">\n",{"type":43,"tag":535,"props":1731,"children":1732},{"class":537,"line":574},[1733],{"type":43,"tag":535,"props":1734,"children":1735},{},[1736],{"type":49,"value":1737},"            \u003CLabel Text=\"{Binding Name}\"\n",{"type":43,"tag":535,"props":1739,"children":1740},{"class":537,"line":583},[1741],{"type":43,"tag":535,"props":1742,"children":1743},{},[1744],{"type":49,"value":1745},"                   FontAttributes=\"Bold\"\n",{"type":43,"tag":535,"props":1747,"children":1748},{"class":537,"line":592},[1749],{"type":43,"tag":535,"props":1750,"children":1751},{},[1752],{"type":49,"value":1753},"                   BackgroundColor=\"{StaticResource Gray100}\"\n",{"type":43,"tag":535,"props":1755,"children":1756},{"class":537,"line":601},[1757],{"type":43,"tag":535,"props":1758,"children":1759},{},[1760],{"type":49,"value":1761},"                   Padding=\"8\" \u002F>\n",{"type":43,"tag":535,"props":1763,"children":1764},{"class":537,"line":610},[1765],{"type":43,"tag":535,"props":1766,"children":1767},{},[1768],{"type":49,"value":1119},{"type":43,"tag":535,"props":1770,"children":1771},{"class":537,"line":619},[1772],{"type":43,"tag":535,"props":1773,"children":1774},{},[1775],{"type":49,"value":1776},"    \u003C\u002FCollectionView.GroupHeaderTemplate>\n",{"type":43,"tag":535,"props":1778,"children":1779},{"class":537,"line":628},[1780],{"type":43,"tag":535,"props":1781,"children":1782},{},[1783],{"type":49,"value":1055},{"type":43,"tag":535,"props":1785,"children":1786},{"class":537,"line":637},[1787],{"type":43,"tag":535,"props":1788,"children":1789},{},[1790],{"type":49,"value":1791},"        \u003CDataTemplate x:DataType=\"models:Animal\">\n",{"type":43,"tag":535,"props":1793,"children":1794},{"class":537,"line":646},[1795],{"type":43,"tag":535,"props":1796,"children":1797},{},[1798],{"type":49,"value":1799},"            \u003CLabel Text=\"{Binding Name}\" Padding=\"16,4\" \u002F>\n",{"type":43,"tag":535,"props":1801,"children":1802},{"class":537,"line":655},[1803],{"type":43,"tag":535,"props":1804,"children":1805},{},[1806],{"type":49,"value":1119},{"type":43,"tag":535,"props":1808,"children":1809},{"class":537,"line":664},[1810],{"type":43,"tag":535,"props":1811,"children":1812},{},[1813],{"type":49,"value":1127},{"type":43,"tag":535,"props":1815,"children":1816},{"class":537,"line":673},[1817],{"type":43,"tag":535,"props":1818,"children":1819},{},[1820],{"type":49,"value":1135},{"type":43,"tag":81,"props":1822,"children":1824},{"id":1823},"pull-to-refresh",[1825],{"type":49,"value":1826},"Pull-to-Refresh",{"type":43,"tag":52,"props":1828,"children":1829},{},[1830,1832,1837,1839,1845,1847,1853,1855,1861],{"type":49,"value":1831},"Wrap ",{"type":43,"tag":56,"props":1833,"children":1835},{"className":1834},[],[1836],{"type":49,"value":61},{"type":49,"value":1838}," in a ",{"type":43,"tag":56,"props":1840,"children":1842},{"className":1841},[],[1843],{"type":49,"value":1844},"RefreshView",{"type":49,"value":1846},". Set ",{"type":43,"tag":56,"props":1848,"children":1850},{"className":1849},[],[1851],{"type":49,"value":1852},"IsRefreshing",{"type":49,"value":1854}," back to ",{"type":43,"tag":56,"props":1856,"children":1858},{"className":1857},[],[1859],{"type":49,"value":1860},"false",{"type":49,"value":1862}," when done:",{"type":43,"tag":524,"props":1864,"children":1866},{"className":526,"code":1865,"language":528,"meta":529,"style":529},"\u003CRefreshView IsRefreshing=\"{Binding IsRefreshing}\"\n             Command=\"{Binding RefreshCommand}\">\n    \u003CCollectionView ItemsSource=\"{Binding Items}\" \u002F>\n\u003C\u002FRefreshView>\n",[1867],{"type":43,"tag":56,"props":1868,"children":1869},{"__ignoreMap":529},[1870,1878,1886,1894],{"type":43,"tag":535,"props":1871,"children":1872},{"class":537,"line":538},[1873],{"type":43,"tag":535,"props":1874,"children":1875},{},[1876],{"type":49,"value":1877},"\u003CRefreshView IsRefreshing=\"{Binding IsRefreshing}\"\n",{"type":43,"tag":535,"props":1879,"children":1880},{"class":537,"line":547},[1881],{"type":43,"tag":535,"props":1882,"children":1883},{},[1884],{"type":49,"value":1885},"             Command=\"{Binding RefreshCommand}\">\n",{"type":43,"tag":535,"props":1887,"children":1888},{"class":537,"line":556},[1889],{"type":43,"tag":535,"props":1890,"children":1891},{},[1892],{"type":49,"value":1893},"    \u003CCollectionView ItemsSource=\"{Binding Items}\" \u002F>\n",{"type":43,"tag":535,"props":1895,"children":1896},{"class":537,"line":565},[1897],{"type":43,"tag":535,"props":1898,"children":1899},{},[1900],{"type":49,"value":1901},"\u003C\u002FRefreshView>\n",{"type":43,"tag":81,"props":1903,"children":1905},{"id":1904},"incremental-loading-infinite-scroll",[1906],{"type":49,"value":1907},"Incremental Loading (Infinite Scroll)",{"type":43,"tag":524,"props":1909,"children":1911},{"className":526,"code":1910,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding Items}\"\n                RemainingItemsThreshold=\"5\"\n                RemainingItemsThresholdReachedCommand=\"{Binding LoadMoreCommand}\" \u002F>\n",[1912],{"type":43,"tag":56,"props":1913,"children":1914},{"__ignoreMap":529},[1915,1922,1930],{"type":43,"tag":535,"props":1916,"children":1917},{"class":537,"line":538},[1918],{"type":43,"tag":535,"props":1919,"children":1920},{},[1921],{"type":49,"value":1156},{"type":43,"tag":535,"props":1923,"children":1924},{"class":537,"line":547},[1925],{"type":43,"tag":535,"props":1926,"children":1927},{},[1928],{"type":49,"value":1929},"                RemainingItemsThreshold=\"5\"\n",{"type":43,"tag":535,"props":1931,"children":1932},{"class":537,"line":556},[1933],{"type":43,"tag":535,"props":1934,"children":1935},{},[1936],{"type":49,"value":1937},"                RemainingItemsThresholdReachedCommand=\"{Binding LoadMoreCommand}\" \u002F>\n",{"type":43,"tag":1939,"props":1940,"children":1941},"blockquote",{},[1942],{"type":43,"tag":52,"props":1943,"children":1944},{},[1945,1947,1952,1953,1959,1961,1966,1968,1973,1974,1979,1981,1986],{"type":49,"value":1946},"⚠️ ",{"type":43,"tag":200,"props":1948,"children":1949},{},[1950],{"type":49,"value":1951},"Do NOT use with non-virtualizing layouts.",{"type":49,"value":264},{"type":43,"tag":56,"props":1954,"children":1956},{"className":1955},[],[1957],{"type":49,"value":1958},"LinearItemsLayout",{"type":49,"value":1960}," and ",{"type":43,"tag":56,"props":1962,"children":1964},{"className":1963},[],[1965],{"type":49,"value":946},{"type":49,"value":1967}," support virtualization. Using ",{"type":43,"tag":56,"props":1969,"children":1971},{"className":1970},[],[1972],{"type":49,"value":180},{"type":49,"value":182},{"type":43,"tag":56,"props":1975,"children":1977},{"className":1976},[],[1978],{"type":49,"value":149},{"type":49,"value":1980}," as an alternative to ",{"type":43,"tag":56,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":49,"value":61},{"type":49,"value":1987}," has no virtualization, which triggers infinite threshold-reached events.",{"type":43,"tag":81,"props":1989,"children":1991},{"id":1990},"swipeview-binding-from-inside-datatemplate",[1992],{"type":49,"value":1993},"SwipeView — Binding from Inside DataTemplate",{"type":43,"tag":52,"props":1995,"children":1996},{},[1997,1999,2004,2006,2012],{"type":49,"value":1998},"Commands inside a ",{"type":43,"tag":56,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":49,"value":381},{"type":49,"value":2005}," can't directly reach your ViewModel. Use ",{"type":43,"tag":56,"props":2007,"children":2009},{"className":2008},[],[2010],{"type":49,"value":2011},"RelativeSource AncestorType",{"type":49,"value":1391},{"type":43,"tag":524,"props":2014,"children":2016},{"className":526,"code":2015,"language":528,"meta":529,"style":529},"\u003CCollectionView.ItemTemplate>\n    \u003CDataTemplate x:DataType=\"models:Item\">\n        \u003CSwipeView>\n            \u003CSwipeView.RightItems>\n                \u003CSwipeItems>\n                    \u003CSwipeItem Text=\"Delete\"\n                               BackgroundColor=\"Red\"\n                               Command=\"{Binding BindingContext.DeleteCommand, Source={RelativeSource AncestorType={x:Type ContentPage}}}\"\n                               CommandParameter=\"{Binding}\" \u002F>\n                \u003C\u002FSwipeItems>\n            \u003C\u002FSwipeView.RightItems>\n            \u003CGrid Padding=\"8\">\n                \u003CLabel Text=\"{Binding Name}\" \u002F>\n            \u003C\u002FGrid>\n        \u003C\u002FSwipeView>\n    \u003C\u002FDataTemplate>\n\u003C\u002FCollectionView.ItemTemplate>\n",[2017],{"type":43,"tag":56,"props":2018,"children":2019},{"__ignoreMap":529},[2020,2027,2034,2042,2050,2058,2066,2074,2082,2090,2098,2106,2114,2122,2130,2138,2145],{"type":43,"tag":535,"props":2021,"children":2022},{"class":537,"line":538},[2023],{"type":43,"tag":535,"props":2024,"children":2025},{},[2026],{"type":49,"value":1406},{"type":43,"tag":535,"props":2028,"children":2029},{"class":537,"line":547},[2030],{"type":43,"tag":535,"props":2031,"children":2032},{},[2033],{"type":49,"value":1414},{"type":43,"tag":535,"props":2035,"children":2036},{"class":537,"line":556},[2037],{"type":43,"tag":535,"props":2038,"children":2039},{},[2040],{"type":49,"value":2041},"        \u003CSwipeView>\n",{"type":43,"tag":535,"props":2043,"children":2044},{"class":537,"line":565},[2045],{"type":43,"tag":535,"props":2046,"children":2047},{},[2048],{"type":49,"value":2049},"            \u003CSwipeView.RightItems>\n",{"type":43,"tag":535,"props":2051,"children":2052},{"class":537,"line":574},[2053],{"type":43,"tag":535,"props":2054,"children":2055},{},[2056],{"type":49,"value":2057},"                \u003CSwipeItems>\n",{"type":43,"tag":535,"props":2059,"children":2060},{"class":537,"line":583},[2061],{"type":43,"tag":535,"props":2062,"children":2063},{},[2064],{"type":49,"value":2065},"                    \u003CSwipeItem Text=\"Delete\"\n",{"type":43,"tag":535,"props":2067,"children":2068},{"class":537,"line":592},[2069],{"type":43,"tag":535,"props":2070,"children":2071},{},[2072],{"type":49,"value":2073},"                               BackgroundColor=\"Red\"\n",{"type":43,"tag":535,"props":2075,"children":2076},{"class":537,"line":601},[2077],{"type":43,"tag":535,"props":2078,"children":2079},{},[2080],{"type":49,"value":2081},"                               Command=\"{Binding BindingContext.DeleteCommand, Source={RelativeSource AncestorType={x:Type ContentPage}}}\"\n",{"type":43,"tag":535,"props":2083,"children":2084},{"class":537,"line":610},[2085],{"type":43,"tag":535,"props":2086,"children":2087},{},[2088],{"type":49,"value":2089},"                               CommandParameter=\"{Binding}\" \u002F>\n",{"type":43,"tag":535,"props":2091,"children":2092},{"class":537,"line":619},[2093],{"type":43,"tag":535,"props":2094,"children":2095},{},[2096],{"type":49,"value":2097},"                \u003C\u002FSwipeItems>\n",{"type":43,"tag":535,"props":2099,"children":2100},{"class":537,"line":628},[2101],{"type":43,"tag":535,"props":2102,"children":2103},{},[2104],{"type":49,"value":2105},"            \u003C\u002FSwipeView.RightItems>\n",{"type":43,"tag":535,"props":2107,"children":2108},{"class":537,"line":637},[2109],{"type":43,"tag":535,"props":2110,"children":2111},{},[2112],{"type":49,"value":2113},"            \u003CGrid Padding=\"8\">\n",{"type":43,"tag":535,"props":2115,"children":2116},{"class":537,"line":646},[2117],{"type":43,"tag":535,"props":2118,"children":2119},{},[2120],{"type":49,"value":2121},"                \u003CLabel Text=\"{Binding Name}\" \u002F>\n",{"type":43,"tag":535,"props":2123,"children":2124},{"class":537,"line":655},[2125],{"type":43,"tag":535,"props":2126,"children":2127},{},[2128],{"type":49,"value":2129},"            \u003C\u002FGrid>\n",{"type":43,"tag":535,"props":2131,"children":2132},{"class":537,"line":664},[2133],{"type":43,"tag":535,"props":2134,"children":2135},{},[2136],{"type":49,"value":2137},"        \u003C\u002FSwipeView>\n",{"type":43,"tag":535,"props":2139,"children":2140},{"class":537,"line":673},[2141],{"type":43,"tag":535,"props":2142,"children":2143},{},[2144],{"type":49,"value":1564},{"type":43,"tag":535,"props":2146,"children":2147},{"class":537,"line":682},[2148],{"type":43,"tag":535,"props":2149,"children":2150},{},[2151],{"type":49,"value":1573},{"type":43,"tag":81,"props":2153,"children":2155},{"id":2154},"emptyview",[2156],{"type":49,"value":2157},"EmptyView",{"type":43,"tag":52,"props":2159,"children":2160},{},[2161,2163,2168],{"type":49,"value":2162},"Shown when ",{"type":43,"tag":56,"props":2164,"children":2166},{"className":2165},[],[2167],{"type":49,"value":459},{"type":49,"value":2169}," is empty or null.",{"type":43,"tag":524,"props":2171,"children":2173},{"className":526,"code":2172,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding SearchResults}\"\n                EmptyView=\"No items found.\" \u002F>\n",[2174],{"type":43,"tag":56,"props":2175,"children":2176},{"__ignoreMap":529},[2177,2185],{"type":43,"tag":535,"props":2178,"children":2179},{"class":537,"line":538},[2180],{"type":43,"tag":535,"props":2181,"children":2182},{},[2183],{"type":49,"value":2184},"\u003CCollectionView ItemsSource=\"{Binding SearchResults}\"\n",{"type":43,"tag":535,"props":2186,"children":2187},{"class":537,"line":547},[2188],{"type":43,"tag":535,"props":2189,"children":2190},{},[2191],{"type":49,"value":2192},"                EmptyView=\"No items found.\" \u002F>\n",{"type":43,"tag":52,"props":2194,"children":2195},{},[2196,2198,2204],{"type":49,"value":2197},"For a custom empty view, wrap in ",{"type":43,"tag":56,"props":2199,"children":2201},{"className":2200},[],[2202],{"type":49,"value":2203},"ContentView",{"type":49,"value":1391},{"type":43,"tag":524,"props":2206,"children":2208},{"className":526,"code":2207,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding SearchResults}\">\n    \u003CCollectionView.EmptyView>\n        \u003CContentView>\n            \u003CVerticalStackLayout HorizontalOptions=\"Center\" VerticalOptions=\"Center\">\n                \u003CImage Source=\"empty_state.png\" WidthRequest=\"120\" \u002F>\n                \u003CLabel Text=\"Nothing here yet\" HorizontalTextAlignment=\"Center\" \u002F>\n            \u003C\u002FVerticalStackLayout>\n        \u003C\u002FContentView>\n    \u003C\u002FCollectionView.EmptyView>\n\u003C\u002FCollectionView>\n",[2209],{"type":43,"tag":56,"props":2210,"children":2211},{"__ignoreMap":529},[2212,2220,2228,2236,2244,2252,2260,2268,2276,2284],{"type":43,"tag":535,"props":2213,"children":2214},{"class":537,"line":538},[2215],{"type":43,"tag":535,"props":2216,"children":2217},{},[2218],{"type":49,"value":2219},"\u003CCollectionView ItemsSource=\"{Binding SearchResults}\">\n",{"type":43,"tag":535,"props":2221,"children":2222},{"class":537,"line":547},[2223],{"type":43,"tag":535,"props":2224,"children":2225},{},[2226],{"type":49,"value":2227},"    \u003CCollectionView.EmptyView>\n",{"type":43,"tag":535,"props":2229,"children":2230},{"class":537,"line":556},[2231],{"type":43,"tag":535,"props":2232,"children":2233},{},[2234],{"type":49,"value":2235},"        \u003CContentView>\n",{"type":43,"tag":535,"props":2237,"children":2238},{"class":537,"line":565},[2239],{"type":43,"tag":535,"props":2240,"children":2241},{},[2242],{"type":49,"value":2243},"            \u003CVerticalStackLayout HorizontalOptions=\"Center\" VerticalOptions=\"Center\">\n",{"type":43,"tag":535,"props":2245,"children":2246},{"class":537,"line":574},[2247],{"type":43,"tag":535,"props":2248,"children":2249},{},[2250],{"type":49,"value":2251},"                \u003CImage Source=\"empty_state.png\" WidthRequest=\"120\" \u002F>\n",{"type":43,"tag":535,"props":2253,"children":2254},{"class":537,"line":583},[2255],{"type":43,"tag":535,"props":2256,"children":2257},{},[2258],{"type":49,"value":2259},"                \u003CLabel Text=\"Nothing here yet\" HorizontalTextAlignment=\"Center\" \u002F>\n",{"type":43,"tag":535,"props":2261,"children":2262},{"class":537,"line":592},[2263],{"type":43,"tag":535,"props":2264,"children":2265},{},[2266],{"type":49,"value":2267},"            \u003C\u002FVerticalStackLayout>\n",{"type":43,"tag":535,"props":2269,"children":2270},{"class":537,"line":601},[2271],{"type":43,"tag":535,"props":2272,"children":2273},{},[2274],{"type":49,"value":2275},"        \u003C\u002FContentView>\n",{"type":43,"tag":535,"props":2277,"children":2278},{"class":537,"line":610},[2279],{"type":43,"tag":535,"props":2280,"children":2281},{},[2282],{"type":49,"value":2283},"    \u003C\u002FCollectionView.EmptyView>\n",{"type":43,"tag":535,"props":2285,"children":2286},{"class":537,"line":619},[2287],{"type":43,"tag":535,"props":2288,"children":2289},{},[2290],{"type":49,"value":1135},{"type":43,"tag":81,"props":2292,"children":2294},{"id":2293},"headers-and-footers",[2295],{"type":49,"value":2296},"Headers and Footers",{"type":43,"tag":524,"props":2298,"children":2300},{"className":526,"code":2299,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding Items}\">\n    \u003CCollectionView.Header>\n        \u003CLabel Text=\"Header\" FontAttributes=\"Bold\" Padding=\"8\" \u002F>\n    \u003C\u002FCollectionView.Header>\n    \u003CCollectionView.Footer>\n        \u003CLabel Text=\"Footer\" FontAttributes=\"Italic\" Padding=\"8\" \u002F>\n    \u003C\u002FCollectionView.Footer>\n\u003C\u002FCollectionView>\n",[2301],{"type":43,"tag":56,"props":2302,"children":2303},{"__ignoreMap":529},[2304,2311,2319,2327,2335,2343,2351,2359],{"type":43,"tag":535,"props":2305,"children":2306},{"class":537,"line":538},[2307],{"type":43,"tag":535,"props":2308,"children":2309},{},[2310],{"type":49,"value":999},{"type":43,"tag":535,"props":2312,"children":2313},{"class":537,"line":547},[2314],{"type":43,"tag":535,"props":2315,"children":2316},{},[2317],{"type":49,"value":2318},"    \u003CCollectionView.Header>\n",{"type":43,"tag":535,"props":2320,"children":2321},{"class":537,"line":556},[2322],{"type":43,"tag":535,"props":2323,"children":2324},{},[2325],{"type":49,"value":2326},"        \u003CLabel Text=\"Header\" FontAttributes=\"Bold\" Padding=\"8\" \u002F>\n",{"type":43,"tag":535,"props":2328,"children":2329},{"class":537,"line":565},[2330],{"type":43,"tag":535,"props":2331,"children":2332},{},[2333],{"type":49,"value":2334},"    \u003C\u002FCollectionView.Header>\n",{"type":43,"tag":535,"props":2336,"children":2337},{"class":537,"line":574},[2338],{"type":43,"tag":535,"props":2339,"children":2340},{},[2341],{"type":49,"value":2342},"    \u003CCollectionView.Footer>\n",{"type":43,"tag":535,"props":2344,"children":2345},{"class":537,"line":583},[2346],{"type":43,"tag":535,"props":2347,"children":2348},{},[2349],{"type":49,"value":2350},"        \u003CLabel Text=\"Footer\" FontAttributes=\"Italic\" Padding=\"8\" \u002F>\n",{"type":43,"tag":535,"props":2352,"children":2353},{"class":537,"line":592},[2354],{"type":43,"tag":535,"props":2355,"children":2356},{},[2357],{"type":49,"value":2358},"    \u003C\u002FCollectionView.Footer>\n",{"type":43,"tag":535,"props":2360,"children":2361},{"class":537,"line":601},[2362],{"type":43,"tag":535,"props":2363,"children":2364},{},[2365],{"type":49,"value":1135},{"type":43,"tag":52,"props":2367,"children":2368},{},[2369,2370,2376,2378,2384],{"type":49,"value":394},{"type":43,"tag":56,"props":2371,"children":2373},{"className":2372},[],[2374],{"type":49,"value":2375},"HeaderTemplate",{"type":49,"value":2377}," \u002F ",{"type":43,"tag":56,"props":2379,"children":2381},{"className":2380},[],[2382],{"type":49,"value":2383},"FooterTemplate",{"type":49,"value":2385}," when headers or footers are data-bound.",{"type":43,"tag":81,"props":2387,"children":2389},{"id":2388},"scrolling",[2390],{"type":49,"value":2391},"Scrolling",{"type":43,"tag":979,"props":2393,"children":2395},{"id":2394},"scrollto",[2396],{"type":49,"value":2397},"ScrollTo",{"type":43,"tag":52,"props":2399,"children":2400},{},[2401],{"type":49,"value":2402},"Programmatically scroll by index or item:",{"type":43,"tag":524,"props":2404,"children":2406},{"className":1597,"code":2405,"language":1599,"meta":529,"style":529},"\u002F\u002F Scroll to index\ncollectionView.ScrollTo(index: 10, position: ScrollToPosition.Center, animate: true);\n\n\u002F\u002F Scroll to item\ncollectionView.ScrollTo(item: myItem, position: ScrollToPosition.MakeVisible, animate: true);\n",[2407],{"type":43,"tag":56,"props":2408,"children":2409},{"__ignoreMap":529},[2410,2418,2426,2435,2443],{"type":43,"tag":535,"props":2411,"children":2412},{"class":537,"line":538},[2413],{"type":43,"tag":535,"props":2414,"children":2415},{},[2416],{"type":49,"value":2417},"\u002F\u002F Scroll to index\n",{"type":43,"tag":535,"props":2419,"children":2420},{"class":537,"line":547},[2421],{"type":43,"tag":535,"props":2422,"children":2423},{},[2424],{"type":49,"value":2425},"collectionView.ScrollTo(index: 10, position: ScrollToPosition.Center, animate: true);\n",{"type":43,"tag":535,"props":2427,"children":2428},{"class":537,"line":556},[2429],{"type":43,"tag":535,"props":2430,"children":2432},{"emptyLinePlaceholder":2431},true,[2433],{"type":49,"value":2434},"\n",{"type":43,"tag":535,"props":2436,"children":2437},{"class":537,"line":565},[2438],{"type":43,"tag":535,"props":2439,"children":2440},{},[2441],{"type":49,"value":2442},"\u002F\u002F Scroll to item\n",{"type":43,"tag":535,"props":2444,"children":2445},{"class":537,"line":574},[2446],{"type":43,"tag":535,"props":2447,"children":2448},{},[2449],{"type":49,"value":2450},"collectionView.ScrollTo(item: myItem, position: ScrollToPosition.MakeVisible, animate: true);\n",{"type":43,"tag":869,"props":2452,"children":2453},{},[2454,2470],{"type":43,"tag":873,"props":2455,"children":2456},{},[2457],{"type":43,"tag":877,"props":2458,"children":2459},{},[2460,2465],{"type":43,"tag":881,"props":2461,"children":2462},{},[2463],{"type":49,"value":2464},"ScrollToPosition",{"type":43,"tag":881,"props":2466,"children":2467},{},[2468],{"type":49,"value":2469},"Behavior",{"type":43,"tag":891,"props":2471,"children":2472},{},[2473,2490,2507,2524],{"type":43,"tag":877,"props":2474,"children":2475},{},[2476,2485],{"type":43,"tag":898,"props":2477,"children":2478},{},[2479],{"type":43,"tag":56,"props":2480,"children":2482},{"className":2481},[],[2483],{"type":49,"value":2484},"MakeVisible",{"type":43,"tag":898,"props":2486,"children":2487},{},[2488],{"type":49,"value":2489},"Scrolls just enough to make the item visible",{"type":43,"tag":877,"props":2491,"children":2492},{},[2493,2502],{"type":43,"tag":898,"props":2494,"children":2495},{},[2496],{"type":43,"tag":56,"props":2497,"children":2499},{"className":2498},[],[2500],{"type":49,"value":2501},"Start",{"type":43,"tag":898,"props":2503,"children":2504},{},[2505],{"type":49,"value":2506},"Scrolls item to the start of the viewport",{"type":43,"tag":877,"props":2508,"children":2509},{},[2510,2519],{"type":43,"tag":898,"props":2511,"children":2512},{},[2513],{"type":43,"tag":56,"props":2514,"children":2516},{"className":2515},[],[2517],{"type":49,"value":2518},"Center",{"type":43,"tag":898,"props":2520,"children":2521},{},[2522],{"type":49,"value":2523},"Scrolls item to the center of the viewport",{"type":43,"tag":877,"props":2525,"children":2526},{},[2527,2536],{"type":43,"tag":898,"props":2528,"children":2529},{},[2530],{"type":43,"tag":56,"props":2531,"children":2533},{"className":2532},[],[2534],{"type":49,"value":2535},"End",{"type":43,"tag":898,"props":2537,"children":2538},{},[2539],{"type":49,"value":2540},"Scrolls item to the end of the viewport",{"type":43,"tag":979,"props":2542,"children":2544},{"id":2543},"snap-points",[2545],{"type":49,"value":2546},"Snap Points",{"type":43,"tag":524,"props":2548,"children":2550},{"className":526,"code":2549,"language":528,"meta":529,"style":529},"\u003CCollectionView.ItemsLayout>\n    \u003CLinearItemsLayout Orientation=\"Horizontal\"\n                       SnapPointsType=\"MandatorySingle\"\n                       SnapPointsAlignment=\"Center\" \u002F>\n\u003C\u002FCollectionView.ItemsLayout>\n",[2551],{"type":43,"tag":56,"props":2552,"children":2553},{"__ignoreMap":529},[2554,2562,2570,2578,2586],{"type":43,"tag":535,"props":2555,"children":2556},{"class":537,"line":538},[2557],{"type":43,"tag":535,"props":2558,"children":2559},{},[2560],{"type":49,"value":2561},"\u003CCollectionView.ItemsLayout>\n",{"type":43,"tag":535,"props":2563,"children":2564},{"class":537,"line":547},[2565],{"type":43,"tag":535,"props":2566,"children":2567},{},[2568],{"type":49,"value":2569},"    \u003CLinearItemsLayout Orientation=\"Horizontal\"\n",{"type":43,"tag":535,"props":2571,"children":2572},{"class":537,"line":556},[2573],{"type":43,"tag":535,"props":2574,"children":2575},{},[2576],{"type":49,"value":2577},"                       SnapPointsType=\"MandatorySingle\"\n",{"type":43,"tag":535,"props":2579,"children":2580},{"class":537,"line":565},[2581],{"type":43,"tag":535,"props":2582,"children":2583},{},[2584],{"type":49,"value":2585},"                       SnapPointsAlignment=\"Center\" \u002F>\n",{"type":43,"tag":535,"props":2587,"children":2588},{"class":537,"line":574},[2589],{"type":43,"tag":535,"props":2590,"children":2591},{},[2592],{"type":49,"value":2593},"\u003C\u002FCollectionView.ItemsLayout>\n",{"type":43,"tag":88,"props":2595,"children":2596},{},[2597,2627],{"type":43,"tag":92,"props":2598,"children":2599},{},[2600,2606,2608,2613,2614,2620,2621],{"type":43,"tag":56,"props":2601,"children":2603},{"className":2602},[],[2604],{"type":49,"value":2605},"SnapPointsType",{"type":49,"value":2607},": ",{"type":43,"tag":56,"props":2609,"children":2611},{"className":2610},[],[2612],{"type":49,"value":1215},{"type":49,"value":272},{"type":43,"tag":56,"props":2615,"children":2617},{"className":2616},[],[2618],{"type":49,"value":2619},"Mandatory",{"type":49,"value":272},{"type":43,"tag":56,"props":2622,"children":2624},{"className":2623},[],[2625],{"type":49,"value":2626},"MandatorySingle",{"type":43,"tag":92,"props":2628,"children":2629},{},[2630,2636,2637,2642,2643,2648,2649],{"type":43,"tag":56,"props":2631,"children":2633},{"className":2632},[],[2634],{"type":49,"value":2635},"SnapPointsAlignment",{"type":49,"value":2607},{"type":43,"tag":56,"props":2638,"children":2640},{"className":2639},[],[2641],{"type":49,"value":2501},{"type":49,"value":272},{"type":43,"tag":56,"props":2644,"children":2646},{"className":2645},[],[2647],{"type":49,"value":2518},{"type":49,"value":272},{"type":43,"tag":56,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":49,"value":2535},{"type":43,"tag":81,"props":2655,"children":2657},{"id":2656},"migrating-from-listview",[2658],{"type":49,"value":315},{"type":43,"tag":52,"props":2660,"children":2661},{},[2662,2667,2669,2674,2676,2682,2684,2689,2691,2696,2698,2708,2710,2715,2717,2722],{"type":43,"tag":56,"props":2663,"children":2665},{"className":2664},[],[2666],{"type":49,"value":69},{"type":49,"value":2668}," still compiles, but ",{"type":43,"tag":200,"props":2670,"children":2671},{},[2672],{"type":49,"value":2673},"as of .NET 10",{"type":49,"value":2675}," it is marked ",{"type":43,"tag":56,"props":2677,"children":2679},{"className":2678},[],[2680],{"type":49,"value":2681},"[Obsolete]",{"type":49,"value":2683},"\n(\"",{"type":43,"tag":295,"props":2685,"children":2686},{},[2687],{"type":49,"value":2688},"ListView is deprecated. Please use CollectionView instead.",{"type":49,"value":2690},"\"). It is ",{"type":43,"tag":200,"props":2692,"children":2693},{},[2694],{"type":49,"value":2695},"not",{"type":49,"value":2697},"\nobsolete on .NET 9 and earlier, so check the project's target framework before\ndescribing it as deprecated. ",{"type":43,"tag":200,"props":2699,"children":2700},{},[2701,2703],{"type":49,"value":2702},"If the user asks\nwhich control to use, or is migrating from Xamarin.Forms, recommend\n",{"type":43,"tag":56,"props":2704,"children":2706},{"className":2705},[],[2707],{"type":49,"value":61},{"type":49,"value":2709}," — it is faster, needs no ",{"type":43,"tag":56,"props":2711,"children":2713},{"className":2712},[],[2714],{"type":49,"value":77},{"type":49,"value":2716},", and supports flexible\nlayouts. What to avoid is silently rewriting ",{"type":43,"tag":56,"props":2718,"children":2720},{"className":2719},[],[2721],{"type":49,"value":69},{"type":49,"value":2723}," code the user did not ask\nyou to touch.",{"type":43,"tag":869,"props":2725,"children":2726},{},[2727,2751],{"type":43,"tag":873,"props":2728,"children":2729},{},[2730],{"type":43,"tag":877,"props":2731,"children":2732},{},[2733,2741],{"type":43,"tag":881,"props":2734,"children":2735},{},[2736],{"type":43,"tag":56,"props":2737,"children":2739},{"className":2738},[],[2740],{"type":49,"value":69},{"type":43,"tag":881,"props":2742,"children":2743},{},[2744,2749],{"type":43,"tag":56,"props":2745,"children":2747},{"className":2746},[],[2748],{"type":49,"value":61},{"type":49,"value":2750}," equivalent",{"type":43,"tag":891,"props":2752,"children":2753},{},[2754,2796,2827,2866,2902,2923,2946,2973],{"type":43,"tag":877,"props":2755,"children":2756},{},[2757,2767],{"type":43,"tag":898,"props":2758,"children":2759},{},[2760,2765],{"type":43,"tag":56,"props":2761,"children":2763},{"className":2762},[],[2764],{"type":49,"value":77},{"type":49,"value":2766}," template root",{"type":43,"tag":898,"props":2768,"children":2769},{},[2770,2772,2777,2779,2784,2786],{"type":49,"value":2771},"Any ",{"type":43,"tag":56,"props":2773,"children":2775},{"className":2774},[],[2776],{"type":49,"value":810},{"type":49,"value":2778},"\u002F",{"type":43,"tag":56,"props":2780,"children":2782},{"className":2781},[],[2783],{"type":49,"value":803},{"type":49,"value":2785}," root — ",{"type":43,"tag":200,"props":2787,"children":2788},{},[2789,2794],{"type":43,"tag":56,"props":2790,"children":2792},{"className":2791},[],[2793],{"type":49,"value":77},{"type":49,"value":2795}," is not supported",{"type":43,"tag":877,"props":2797,"children":2798},{},[2799,2810],{"type":43,"tag":898,"props":2800,"children":2801},{},[2802,2808],{"type":43,"tag":56,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":49,"value":2807},"ItemSelected",{"type":49,"value":2809}," event",{"type":43,"tag":898,"props":2811,"children":2812},{},[2813,2819,2821],{"type":43,"tag":56,"props":2814,"children":2816},{"className":2815},[],[2817],{"type":49,"value":2818},"SelectionChanged",{"type":49,"value":2820}," event, or ",{"type":43,"tag":56,"props":2822,"children":2824},{"className":2823},[],[2825],{"type":49,"value":2826},"SelectionChangedCommand",{"type":43,"tag":877,"props":2828,"children":2829},{},[2830,2840],{"type":43,"tag":898,"props":2831,"children":2832},{},[2833,2839],{"type":43,"tag":56,"props":2834,"children":2836},{"className":2835},[],[2837],{"type":49,"value":2838},"ItemTapped",{"type":49,"value":2809},{"type":43,"tag":898,"props":2841,"children":2842},{},[2843,2844,2850,2852,2857,2859,2864],{"type":49,"value":464},{"type":43,"tag":56,"props":2845,"children":2847},{"className":2846},[],[2848],{"type":49,"value":2849},"TapGestureRecognizer",{"type":49,"value":2851}," in the item template — ",{"type":43,"tag":56,"props":2853,"children":2855},{"className":2854},[],[2856],{"type":49,"value":2818},{"type":49,"value":2858}," only fires when the selection ",{"type":43,"tag":295,"props":2860,"children":2861},{},[2862],{"type":49,"value":2863},"changes",{"type":49,"value":2865},", so it will not re-fire on tapping the already-selected item",{"type":43,"tag":877,"props":2867,"children":2868},{},[2869,2886],{"type":43,"tag":898,"props":2870,"children":2871},{},[2872,2878,2880],{"type":43,"tag":56,"props":2873,"children":2875},{"className":2874},[],[2876],{"type":49,"value":2877},"IsPullToRefreshEnabled",{"type":49,"value":2879}," + ",{"type":43,"tag":56,"props":2881,"children":2883},{"className":2882},[],[2884],{"type":49,"value":2885},"Refreshing",{"type":43,"tag":898,"props":2887,"children":2888},{},[2889,2891,2896,2897],{"type":49,"value":2890},"Wrap the ",{"type":43,"tag":56,"props":2892,"children":2894},{"className":2893},[],[2895],{"type":49,"value":61},{"type":49,"value":1838},{"type":43,"tag":56,"props":2898,"children":2900},{"className":2899},[],[2901],{"type":49,"value":1844},{"type":43,"tag":877,"props":2903,"children":2904},{},[2905,2914],{"type":43,"tag":898,"props":2906,"children":2907},{},[2908],{"type":43,"tag":56,"props":2909,"children":2911},{"className":2910},[],[2912],{"type":49,"value":2913},"IsGroupingEnabled",{"type":43,"tag":898,"props":2915,"children":2916},{},[2917],{"type":43,"tag":56,"props":2918,"children":2920},{"className":2919},[],[2921],{"type":49,"value":2922},"IsGrouped",{"type":43,"tag":877,"props":2924,"children":2925},{},[2926,2935],{"type":43,"tag":898,"props":2927,"children":2928},{},[2929],{"type":43,"tag":56,"props":2930,"children":2932},{"className":2931},[],[2933],{"type":49,"value":2934},"HasUnevenRows=\"True\"",{"type":43,"tag":898,"props":2936,"children":2937},{},[2938,2940],{"type":49,"value":2939},"Default ",{"type":43,"tag":56,"props":2941,"children":2943},{"className":2942},[],[2944],{"type":49,"value":2945},"ItemSizingStrategy=\"MeasureAllItems\"",{"type":43,"tag":877,"props":2947,"children":2948},{},[2949,2960],{"type":43,"tag":898,"props":2950,"children":2951},{},[2952,2958],{"type":43,"tag":56,"props":2953,"children":2955},{"className":2954},[],[2956],{"type":49,"value":2957},"RowHeight",{"type":49,"value":2959}," (fixed height)",{"type":43,"tag":898,"props":2961,"children":2962},{},[2963,2965,2971],{"type":49,"value":2964},"Set the height in the item template. ",{"type":43,"tag":56,"props":2966,"children":2968},{"className":2967},[],[2969],{"type":49,"value":2970},"MeasureFirstItem",{"type":49,"value":2972}," only reuses the first item's measured size — it is not an explicit row height",{"type":43,"tag":877,"props":2974,"children":2975},{},[2976,2992],{"type":43,"tag":898,"props":2977,"children":2978},{},[2979,2985,2986],{"type":43,"tag":56,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":49,"value":2984},"SeparatorVisibility",{"type":49,"value":2377},{"type":43,"tag":56,"props":2987,"children":2989},{"className":2988},[],[2990],{"type":49,"value":2991},"SeparatorColor",{"type":43,"tag":898,"props":2993,"children":2994},{},[2995,3000,3002,3008,3009,3015],{"type":43,"tag":200,"props":2996,"children":2997},{},[2998],{"type":49,"value":2999},"No equivalent",{"type":49,"value":3001}," — draw a ",{"type":43,"tag":56,"props":3003,"children":3005},{"className":3004},[],[3006],{"type":49,"value":3007},"BoxView",{"type":49,"value":2778},{"type":43,"tag":56,"props":3010,"children":3012},{"className":3011},[],[3013],{"type":49,"value":3014},"Border",{"type":49,"value":3016}," in the item template",{"type":43,"tag":52,"props":3018,"children":3019},{},[3020,3022,3027],{"type":49,"value":3021},"The missing separator API is the most common migration surprise: ",{"type":43,"tag":56,"props":3023,"children":3025},{"className":3024},[],[3026],{"type":49,"value":61},{"type":49,"value":3028},"\nhas no built-in separators, so add one to the template yourself.",{"type":43,"tag":81,"props":3030,"children":3032},{"id":3031},"performance-tips",[3033],{"type":49,"value":3034},"Performance Tips",{"type":43,"tag":52,"props":3036,"children":3037},{},[3038],{"type":49,"value":3039},"Apply these only when the user reports a performance problem or explicitly asks\nabout performance — they are not a default checklist.",{"type":43,"tag":88,"props":3041,"children":3042},{},[3043,3245,3309],{"type":43,"tag":92,"props":3044,"children":3045},{},[3046,3055,3057,3063,3065,3070,3072,3078,3080,3084,3085,3090,3092,3097,3099,3187,3199,3201,3206,3208],{"type":43,"tag":200,"props":3047,"children":3048},{},[3049,3050],{"type":49,"value":394},{"type":43,"tag":56,"props":3051,"children":3053},{"className":3052},[],[3054],{"type":49,"value":2970},{"type":49,"value":3056}," for uniform item sizes — significantly faster than the default\n",{"type":43,"tag":56,"props":3058,"children":3060},{"className":3059},[],[3061],{"type":49,"value":3062},"MeasureAllItems",{"type":49,"value":3064},", which measures every item individually. Set it on the ",{"type":43,"tag":56,"props":3066,"children":3068},{"className":3067},[],[3069],{"type":49,"value":61},{"type":49,"value":3071},"\nitself (it is declared on ",{"type":43,"tag":56,"props":3073,"children":3075},{"className":3074},[],[3076],{"type":49,"value":3077},"StructuredItemsView",{"type":49,"value":3079},"), ",{"type":43,"tag":200,"props":3081,"children":3082},{},[3083],{"type":49,"value":2695},{"type":49,"value":835},{"type":43,"tag":56,"props":3086,"children":3088},{"className":3087},[],[3089],{"type":49,"value":1958},{"type":49,"value":3091}," \u002F\n",{"type":43,"tag":56,"props":3093,"children":3095},{"className":3094},[],[3096],{"type":49,"value":946},{"type":49,"value":3098},":\n",{"type":43,"tag":524,"props":3100,"children":3102},{"className":526,"code":3101,"language":528,"meta":529,"style":529},"\u003CCollectionView ItemsSource=\"{Binding Items}\"\n                ItemSizingStrategy=\"MeasureFirstItem\">\n    \u003CCollectionView.ItemTemplate>\n        \u003CDataTemplate x:DataType=\"models:Item\">\n            \u003CGrid Padding=\"8\" ColumnDefinitions=\"44,*\" ColumnSpacing=\"8\">\n                \u003CImage WidthRequest=\"44\" HeightRequest=\"44\" \u002F>\n                \u003CLabel Grid.Column=\"1\" Text=\"{Binding Name}\" VerticalOptions=\"Center\" \u002F>\n            \u003C\u002FGrid>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.ItemTemplate>\n\u003C\u002FCollectionView>\n",[3103],{"type":43,"tag":56,"props":3104,"children":3105},{"__ignoreMap":529},[3106,3113,3121,3128,3135,3143,3151,3159,3166,3173,3180],{"type":43,"tag":535,"props":3107,"children":3108},{"class":537,"line":538},[3109],{"type":43,"tag":535,"props":3110,"children":3111},{},[3112],{"type":49,"value":1156},{"type":43,"tag":535,"props":3114,"children":3115},{"class":537,"line":547},[3116],{"type":43,"tag":535,"props":3117,"children":3118},{},[3119],{"type":49,"value":3120},"                ItemSizingStrategy=\"MeasureFirstItem\">\n",{"type":43,"tag":535,"props":3122,"children":3123},{"class":537,"line":556},[3124],{"type":43,"tag":535,"props":3125,"children":3126},{},[3127],{"type":49,"value":1055},{"type":43,"tag":535,"props":3129,"children":3130},{"class":537,"line":565},[3131],{"type":43,"tag":535,"props":3132,"children":3133},{},[3134],{"type":49,"value":1063},{"type":43,"tag":535,"props":3136,"children":3137},{"class":537,"line":574},[3138],{"type":43,"tag":535,"props":3139,"children":3140},{},[3141],{"type":49,"value":3142},"            \u003CGrid Padding=\"8\" ColumnDefinitions=\"44,*\" ColumnSpacing=\"8\">\n",{"type":43,"tag":535,"props":3144,"children":3145},{"class":537,"line":583},[3146],{"type":43,"tag":535,"props":3147,"children":3148},{},[3149],{"type":49,"value":3150},"                \u003CImage WidthRequest=\"44\" HeightRequest=\"44\" \u002F>\n",{"type":43,"tag":535,"props":3152,"children":3153},{"class":537,"line":592},[3154],{"type":43,"tag":535,"props":3155,"children":3156},{},[3157],{"type":49,"value":3158},"                \u003CLabel Grid.Column=\"1\" Text=\"{Binding Name}\" VerticalOptions=\"Center\" \u002F>\n",{"type":43,"tag":535,"props":3160,"children":3161},{"class":537,"line":601},[3162],{"type":43,"tag":535,"props":3163,"children":3164},{},[3165],{"type":49,"value":2129},{"type":43,"tag":535,"props":3167,"children":3168},{"class":537,"line":610},[3169],{"type":43,"tag":535,"props":3170,"children":3171},{},[3172],{"type":49,"value":1119},{"type":43,"tag":535,"props":3174,"children":3175},{"class":537,"line":619},[3176],{"type":43,"tag":535,"props":3177,"children":3178},{},[3179],{"type":49,"value":1127},{"type":43,"tag":535,"props":3181,"children":3182},{"class":537,"line":628},[3183],{"type":43,"tag":535,"props":3184,"children":3185},{},[3186],{"type":49,"value":1135},{"type":43,"tag":200,"props":3188,"children":3189},{},[3190,3192,3197],{"type":49,"value":3191},"When ",{"type":43,"tag":56,"props":3193,"children":3195},{"className":3194},[],[3196],{"type":49,"value":2970},{"type":49,"value":3198}," is the wrong choice",{"type":49,"value":3200}," — keep the default ",{"type":43,"tag":56,"props":3202,"children":3204},{"className":3203},[],[3205],{"type":49,"value":3062},{"type":49,"value":3207}," if:\n",{"type":43,"tag":88,"props":3209,"children":3210},{},[3211,3216,3228,3240],{"type":43,"tag":92,"props":3212,"children":3213},{},[3214],{"type":49,"value":3215},"Items vary in height (wrapping text, optional rows, images of differing aspect) — the\nfirst item's size is applied to all, so the rest are clipped or stretched.",{"type":43,"tag":92,"props":3217,"children":3218},{},[3219,3220,3226],{"type":49,"value":464},{"type":43,"tag":56,"props":3221,"children":3223},{"className":3222},[],[3224],{"type":49,"value":3225},"DataTemplateSelector",{"type":49,"value":3227}," returns different templates — the first item won't represent\nthe others.",{"type":43,"tag":92,"props":3229,"children":3230},{},[3231,3233,3238],{"type":49,"value":3232},"The first item is atypical (a header-like or \"featured\" row) — every item inherits its\nsize. Fixing this by reordering data is a smell; use ",{"type":43,"tag":56,"props":3234,"children":3236},{"className":3235},[],[3237],{"type":49,"value":3062},{"type":49,"value":3239}," instead.",{"type":43,"tag":92,"props":3241,"children":3242},{},[3243],{"type":49,"value":3244},"Item size depends on runtime data that isn't loaded yet when the first item is measured.",{"type":43,"tag":92,"props":3246,"children":3247},{},[3248,3258,3260,3266,3268,3274,3275,3281,3282,3288,3290,3295,3297,3302,3307],{"type":43,"tag":200,"props":3249,"children":3250},{},[3251,3252,3257],{"type":49,"value":394},{"type":43,"tag":56,"props":3253,"children":3255},{"className":3254},[],[3256],{"type":49,"value":400},{"type":49,"value":402},{"type":49,"value":3259}," It implements\n",{"type":43,"tag":56,"props":3261,"children":3263},{"className":3262},[],[3264],{"type":49,"value":3265},"INotifyCollectionChanged",{"type":49,"value":3267},", so in-place ",{"type":43,"tag":56,"props":3269,"children":3271},{"className":3270},[],[3272],{"type":49,"value":3273},"Add",{"type":49,"value":2778},{"type":43,"tag":56,"props":3276,"children":3278},{"className":3277},[],[3279],{"type":49,"value":3280},"Remove",{"type":49,"value":2778},{"type":43,"tag":56,"props":3283,"children":3285},{"className":3284},[],[3286],{"type":49,"value":3287},"Insert",{"type":49,"value":3289}," update the UI incrementally.\nA ",{"type":43,"tag":56,"props":3291,"children":3293},{"className":3292},[],[3294],{"type":49,"value":1593},{"type":49,"value":3296}," is fine for a list that never changes after it is bound. Note that ",{"type":43,"tag":295,"props":3298,"children":3299},{},[3300],{"type":49,"value":3301},"replacing",{"type":43,"tag":56,"props":3303,"children":3305},{"className":3304},[],[3306],{"type":49,"value":459},{"type":49,"value":3308}," re-renders everything regardless of the collection type — so mutate the bound\ncollection in place rather than reassigning it.",{"type":43,"tag":92,"props":3310,"children":3311},{},[3312,3317,3318,3324],{"type":43,"tag":200,"props":3313,"children":3314},{},[3315],{"type":49,"value":3316},"Update collections on the UI thread",{"type":49,"value":812},{"type":43,"tag":56,"props":3319,"children":3321},{"className":3320},[],[3322],{"type":49,"value":3323},"MainThread.BeginInvokeOnMainThread(() => Items.Add(item))",{"type":49,"value":262},{"type":43,"tag":81,"props":3326,"children":3328},{"id":3327},"common-pitfalls",[3329],{"type":49,"value":3330},"Common Pitfalls",{"type":43,"tag":869,"props":3332,"children":3333},{},[3334,3350],{"type":43,"tag":873,"props":3335,"children":3336},{},[3337],{"type":43,"tag":877,"props":3338,"children":3339},{},[3340,3345],{"type":43,"tag":881,"props":3341,"children":3342},{},[3343],{"type":49,"value":3344},"Issue",{"type":43,"tag":881,"props":3346,"children":3347},{},[3348],{"type":49,"value":3349},"Fix",{"type":43,"tag":891,"props":3351,"children":3352},{},[3353,3378,3420,3454,3486,3505,3524,3572,3597,3618],{"type":43,"tag":877,"props":3354,"children":3355},{},[3356,3361],{"type":43,"tag":898,"props":3357,"children":3358},{},[3359],{"type":49,"value":3360},"UI doesn't update when items change",{"type":43,"tag":898,"props":3362,"children":3363},{},[3364,3365,3370,3372,3377],{"type":49,"value":394},{"type":43,"tag":56,"props":3366,"children":3368},{"className":3367},[],[3369],{"type":49,"value":400},{"type":49,"value":3371},", not ",{"type":43,"tag":56,"props":3373,"children":3375},{"className":3374},[],[3376],{"type":49,"value":1593},{"type":49,"value":262},{"type":43,"tag":877,"props":3379,"children":3380},{},[3381,3386],{"type":43,"tag":898,"props":3382,"children":3383},{},[3384],{"type":49,"value":3385},"App crashes or blank items",{"type":43,"tag":898,"props":3387,"children":3388},{},[3389,3398,3400,3405,3406,3411,3413,3418],{"type":43,"tag":200,"props":3390,"children":3391},{},[3392,3393],{"type":49,"value":368},{"type":43,"tag":56,"props":3394,"children":3396},{"className":3395},[],[3397],{"type":49,"value":77},{"type":49,"value":3399}," — use ",{"type":43,"tag":56,"props":3401,"children":3403},{"className":3402},[],[3404],{"type":49,"value":141},{"type":49,"value":272},{"type":43,"tag":56,"props":3407,"children":3409},{"className":3408},[],[3410],{"type":49,"value":149},{"type":49,"value":3412},", or any ",{"type":43,"tag":56,"props":3414,"children":3416},{"className":3415},[],[3417],{"type":49,"value":810},{"type":49,"value":3419}," as template root.",{"type":43,"tag":877,"props":3421,"children":3422},{},[3423,3428],{"type":43,"tag":898,"props":3424,"children":3425},{},[3426],{"type":49,"value":3427},"Items disappear or layout breaks",{"type":43,"tag":898,"props":3429,"children":3430},{},[3431,3433,3438,3440,3445,3447,3453],{"type":49,"value":3432},"Always update ",{"type":43,"tag":56,"props":3434,"children":3436},{"className":3435},[],[3437],{"type":49,"value":459},{"type":49,"value":3439}," and the collection on the ",{"type":43,"tag":200,"props":3441,"children":3442},{},[3443],{"type":49,"value":3444},"UI thread",{"type":49,"value":3446}," (",{"type":43,"tag":56,"props":3448,"children":3450},{"className":3449},[],[3451],{"type":49,"value":3452},"MainThread.BeginInvokeOnMainThread",{"type":49,"value":317},{"type":43,"tag":877,"props":3455,"children":3456},{},[3457,3462],{"type":43,"tag":898,"props":3458,"children":3459},{},[3460],{"type":49,"value":3461},"Incremental loading fires endlessly",{"type":43,"tag":898,"props":3463,"children":3464},{},[3465,3467,3472,3474,3479,3480,3485],{"type":49,"value":3466},"Don't use ",{"type":43,"tag":56,"props":3468,"children":3470},{"className":3469},[],[3471],{"type":49,"value":149},{"type":49,"value":3473}," as layout; use ",{"type":43,"tag":56,"props":3475,"children":3477},{"className":3476},[],[3478],{"type":49,"value":1958},{"type":49,"value":143},{"type":43,"tag":56,"props":3481,"children":3483},{"className":3482},[],[3484],{"type":49,"value":946},{"type":49,"value":262},{"type":43,"tag":877,"props":3487,"children":3488},{},[3489,3494],{"type":43,"tag":898,"props":3490,"children":3491},{},[3492],{"type":49,"value":3493},"EmptyView doesn't render correctly",{"type":43,"tag":898,"props":3495,"children":3496},{},[3497,3499,3504],{"type":49,"value":3498},"Wrap custom empty views in ",{"type":43,"tag":56,"props":3500,"children":3502},{"className":3501},[],[3503],{"type":49,"value":2203},{"type":49,"value":262},{"type":43,"tag":877,"props":3506,"children":3507},{},[3508,3513],{"type":43,"tag":898,"props":3509,"children":3510},{},[3511],{"type":49,"value":3512},"Poor scroll performance",{"type":43,"tag":898,"props":3514,"children":3515},{},[3516,3517,3522],{"type":49,"value":394},{"type":43,"tag":56,"props":3518,"children":3520},{"className":3519},[],[3521],{"type":49,"value":2970},{"type":49,"value":3523}," sizing strategy for uniform item sizes.",{"type":43,"tag":877,"props":3525,"children":3526},{},[3527,3538],{"type":43,"tag":898,"props":3528,"children":3529},{},[3530,3536],{"type":43,"tag":56,"props":3531,"children":3533},{"className":3532},[],[3534],{"type":49,"value":3535},"ItemSizingStrategy",{"type":49,"value":3537}," doesn't compile",{"type":43,"tag":898,"props":3539,"children":3540},{},[3541,3543,3548,3550,3556,3558,3564,3565,3571],{"type":49,"value":3542},"It is declared on ",{"type":43,"tag":56,"props":3544,"children":3546},{"className":3545},[],[3547],{"type":49,"value":3077},{"type":49,"value":3549}," — set it on ",{"type":43,"tag":56,"props":3551,"children":3553},{"className":3552},[],[3554],{"type":49,"value":3555},"\u003CCollectionView>",{"type":49,"value":3557},", not on ",{"type":43,"tag":56,"props":3559,"children":3561},{"className":3560},[],[3562],{"type":49,"value":3563},"\u003CLinearItemsLayout>",{"type":49,"value":2377},{"type":43,"tag":56,"props":3566,"children":3568},{"className":3567},[],[3569],{"type":49,"value":3570},"\u003CGridItemsLayout>",{"type":49,"value":262},{"type":43,"tag":877,"props":3573,"children":3574},{},[3575,3580],{"type":43,"tag":898,"props":3576,"children":3577},{},[3578],{"type":49,"value":3579},"Items clipped or stretched",{"type":43,"tag":898,"props":3581,"children":3582},{},[3583,3588,3590,3595],{"type":43,"tag":56,"props":3584,"children":3586},{"className":3585},[],[3587],{"type":49,"value":2970},{"type":49,"value":3589}," assumes uniform item size. Use the default ",{"type":43,"tag":56,"props":3591,"children":3593},{"className":3592},[],[3594],{"type":49,"value":3062},{"type":49,"value":3596}," for variable-height items.",{"type":43,"tag":877,"props":3598,"children":3599},{},[3600,3605],{"type":43,"tag":898,"props":3601,"children":3602},{},[3603],{"type":49,"value":3604},"Selected state not visible",{"type":43,"tag":898,"props":3606,"children":3607},{},[3608,3610,3616],{"type":49,"value":3609},"Add ",{"type":43,"tag":56,"props":3611,"children":3613},{"className":3612},[],[3614],{"type":49,"value":3615},"VisualState Name=\"Selected\"",{"type":49,"value":3617}," to the item template root element.",{"type":43,"tag":877,"props":3619,"children":3620},{},[3621,3626],{"type":43,"tag":898,"props":3622,"children":3623},{},[3624],{"type":49,"value":3625},"Binding errors in SwipeView commands",{"type":43,"tag":898,"props":3627,"children":3628},{},[3629,3630,3635],{"type":49,"value":394},{"type":43,"tag":56,"props":3631,"children":3633},{"className":3632},[],[3634],{"type":49,"value":2011},{"type":49,"value":3636}," to reach the ViewModel from inside the item template.",{"type":43,"tag":81,"props":3638,"children":3640},{"id":3639},"validation",[3641],{"type":49,"value":3642},"Validation",{"type":43,"tag":52,"props":3644,"children":3645},{},[3646],{"type":49,"value":3647},"Before returning CollectionView markup you wrote or edited, confirm:",{"type":43,"tag":88,"props":3649,"children":3652},{"className":3650},[3651],"contains-task-list",[3653,3695,3716,3738,3760,3801,3824],{"type":43,"tag":92,"props":3654,"children":3657},{"className":3655},[3656],"task-list-item",[3658,3663,3665,3670,3672,3677,3678,3683,3684,3688,3689,3694],{"type":43,"tag":3659,"props":3660,"children":3662},"input",{"disabled":2431,"type":3661},"checkbox",[],{"type":49,"value":3664}," The ",{"type":43,"tag":56,"props":3666,"children":3668},{"className":3667},[],[3669],{"type":49,"value":381},{"type":49,"value":3671}," root is a ",{"type":43,"tag":56,"props":3673,"children":3675},{"className":3674},[],[3676],{"type":49,"value":810},{"type":49,"value":2778},{"type":43,"tag":56,"props":3679,"children":3681},{"className":3680},[],[3682],{"type":49,"value":803},{"type":49,"value":812},{"type":43,"tag":200,"props":3685,"children":3686},{},[3687],{"type":49,"value":2695},{"type":49,"value":264},{"type":43,"tag":56,"props":3690,"children":3692},{"className":3691},[],[3693],{"type":49,"value":77},{"type":49,"value":262},{"type":43,"tag":92,"props":3696,"children":3698},{"className":3697},[3656],[3699,3702,3703,3708,3710,3715],{"type":43,"tag":3659,"props":3700,"children":3701},{"disabled":2431,"type":3661},[],{"type":49,"value":264},{"type":43,"tag":56,"props":3704,"children":3706},{"className":3705},[],[3707],{"type":49,"value":381},{"type":49,"value":3709}," declares ",{"type":43,"tag":56,"props":3711,"children":3713},{"className":3712},[],[3714],{"type":49,"value":418},{"type":49,"value":842},{"type":43,"tag":92,"props":3717,"children":3719},{"className":3718},[3656],[3720,3723,3724,3729,3731,3736],{"type":43,"tag":3659,"props":3721,"children":3722},{"disabled":2431,"type":3661},[],{"type":49,"value":264},{"type":43,"tag":56,"props":3725,"children":3727},{"className":3726},[],[3728],{"type":49,"value":459},{"type":49,"value":3730}," is bound to ",{"type":43,"tag":56,"props":3732,"children":3734},{"className":3733},[],[3735],{"type":49,"value":400},{"type":49,"value":3737}," if the list mutates.",{"type":43,"tag":92,"props":3739,"children":3741},{"className":3740},[3656],[3742,3745,3746,3751,3753,3758],{"type":43,"tag":3659,"props":3743,"children":3744},{"disabled":2431,"type":3661},[],{"type":49,"value":264},{"type":43,"tag":56,"props":3747,"children":3749},{"className":3748},[],[3750],{"type":49,"value":3535},{"type":49,"value":3752}," (if used) is on ",{"type":43,"tag":56,"props":3754,"children":3756},{"className":3755},[],[3757],{"type":49,"value":3555},{"type":49,"value":3759},", not on the layout.",{"type":43,"tag":92,"props":3761,"children":3763},{"className":3762},[3656],[3764,3767,3768,3773,3775,3780,3782,3787,3789,3794,3795,3800],{"type":43,"tag":3659,"props":3765,"children":3766},{"disabled":2431,"type":3661},[],{"type":49,"value":264},{"type":43,"tag":56,"props":3769,"children":3771},{"className":3770},[],[3772],{"type":49,"value":1266},{"type":49,"value":3774}," selection binds ",{"type":43,"tag":56,"props":3776,"children":3778},{"className":3777},[],[3779],{"type":49,"value":1275},{"type":49,"value":3781},"; ",{"type":43,"tag":56,"props":3783,"children":3785},{"className":3784},[],[3786],{"type":49,"value":1236},{"type":49,"value":3788}," binds ",{"type":43,"tag":56,"props":3790,"children":3792},{"className":3791},[],[3793],{"type":49,"value":1245},{"type":49,"value":3446},{"type":43,"tag":56,"props":3796,"children":3798},{"className":3797},[],[3799],{"type":49,"value":1254},{"type":49,"value":317},{"type":43,"tag":92,"props":3802,"children":3804},{"className":3803},[3656],[3805,3808,3809,3815,3817,3822],{"type":43,"tag":3659,"props":3806,"children":3807},{"disabled":2431,"type":3661},[],{"type":49,"value":264},{"type":43,"tag":56,"props":3810,"children":3812},{"className":3811},[],[3813],{"type":49,"value":3814},"RefreshView.IsRefreshing",{"type":49,"value":3816}," is set back to ",{"type":43,"tag":56,"props":3818,"children":3820},{"className":3819},[],[3821],{"type":49,"value":1860},{"type":49,"value":3823}," when the refresh completes.",{"type":43,"tag":92,"props":3825,"children":3827},{"className":3826},[3656],[3828,3831,3833,3838],{"type":43,"tag":3659,"props":3829,"children":3830},{"disabled":2431,"type":3661},[],{"type":49,"value":3832}," The answer covers ",{"type":43,"tag":200,"props":3834,"children":3835},{},[3836],{"type":49,"value":3837},"only",{"type":49,"value":3839}," what the user asked — no unrequested sections.",{"type":43,"tag":81,"props":3841,"children":3843},{"id":3842},"references",[3844],{"type":49,"value":3845},"References",{"type":43,"tag":88,"props":3847,"children":3848},{},[3849,3860,3870,3880,3890,3900],{"type":43,"tag":92,"props":3850,"children":3851},{},[3852],{"type":43,"tag":310,"props":3853,"children":3857},{"href":3854,"rel":3855},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002F",[3856],"nofollow",[3858],{"type":49,"value":3859},"CollectionView overview",{"type":43,"tag":92,"props":3861,"children":3862},{},[3863],{"type":43,"tag":310,"props":3864,"children":3867},{"href":3865,"rel":3866},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Flayout",[3856],[3868],{"type":49,"value":3869},"CollectionView layout",{"type":43,"tag":92,"props":3871,"children":3872},{},[3873],{"type":43,"tag":310,"props":3874,"children":3877},{"href":3875,"rel":3876},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Fselection",[3856],[3878],{"type":49,"value":3879},"CollectionView selection",{"type":43,"tag":92,"props":3881,"children":3882},{},[3883],{"type":43,"tag":310,"props":3884,"children":3887},{"href":3885,"rel":3886},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Fgrouping",[3856],[3888],{"type":49,"value":3889},"CollectionView grouping",{"type":43,"tag":92,"props":3891,"children":3892},{},[3893],{"type":43,"tag":310,"props":3894,"children":3897},{"href":3895,"rel":3896},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Fscrolling",[3856],[3898],{"type":49,"value":3899},"CollectionView scrolling",{"type":43,"tag":92,"props":3901,"children":3902},{},[3903],{"type":43,"tag":310,"props":3904,"children":3907},{"href":3905,"rel":3906},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fcontrols\u002Fcollectionview\u002Femptyview",[3856],[3908],{"type":49,"value":3909},"CollectionView EmptyView",{"type":43,"tag":3911,"props":3912,"children":3913},"style",{},[3914],{"type":49,"value":3915},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3917,"total":4079},[3918,3934,3949,3964,3982,3996,4013,4023,4035,4045,4058,4069],{"slug":3919,"name":3919,"fn":3920,"description":3921,"org":3922,"tags":3923,"stars":3931,"repoUrl":3932,"updatedAt":3933},"multithreaded-task-migration","migrate MSBuild tasks to multithreaded mode","Guide for migrating MSBuild tasks to multithreaded mode support, including compatibility red-team review. Use this when converting tasks to thread-safe versions, implementing IMultiThreadableTask, adding TaskEnvironment support, or auditing migrations for behavioral compatibility.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3924,3925,3928],{"name":17,"slug":18,"type":15},{"name":3926,"slug":3927,"type":15},"Engineering","engineering",{"name":3929,"slug":3930,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":3935,"name":3935,"fn":3936,"description":3937,"org":3938,"tags":3939,"stars":25,"repoUrl":26,"updatedAt":3948},"analyzing-dotnet-performance","analyze .NET code for performance anti-patterns","Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I\u002FO with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3940,3941,3944,3947],{"name":17,"slug":18,"type":15},{"name":3942,"slug":3943,"type":15},"Code Analysis","code-analysis",{"name":3945,"slug":3946,"type":15},"Debugging","debugging",{"name":3929,"slug":3930,"type":15},"2026-07-12T08:23:25.400375",{"slug":3950,"name":3950,"fn":3951,"description":3952,"org":3953,"tags":3954,"stars":25,"repoUrl":26,"updatedAt":3963},"android-tombstone-symbolication","symbolicate .NET runtime frames in Android tombstones","Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java\u002FKotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3955,3956,3959,3960],{"name":17,"slug":18,"type":15},{"name":3957,"slug":3958,"type":15},"Android","android",{"name":3945,"slug":3946,"type":15},{"name":3961,"slug":3962,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":3965,"name":3965,"fn":3966,"description":3967,"org":3968,"tags":3969,"stars":25,"repoUrl":26,"updatedAt":3981},"apple-crash-symbolication","symbolicate .NET runtime frames in crash logs","Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift\u002FObjective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3970,3971,3972,3975,3978],{"name":17,"slug":18,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3973,"slug":3974,"type":15},"iOS","ios",{"name":3976,"slug":3977,"type":15},"macOS","macos",{"name":3979,"slug":3980,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":3983,"name":3983,"fn":3984,"description":3985,"org":3986,"tags":3987,"stars":25,"repoUrl":26,"updatedAt":3995},"assertion-quality","evaluate assertion quality in test suites","Analyzes the variety and depth of assertions across test suites in any language. Use when the user asks to evaluate assertion quality, find shallow tests, identify assertion-free tests (no assertions or only trivial ones like Assert.IsNotNull \u002F toBeTruthy()), flag self-referential or tautological assertions, measure assertion diversity, or audit whether tests verify different facets of behavior. Polyglot: .NET, Python, TS\u002FJS, Java, Go, Ruby, Rust, Swift, Kotlin, PowerShell, C++. DO NOT USE FOR: writing new tests (use code-testing-agent \u002F writing-mstest-tests), mutation reasoning about whether tests would catch a bug (use test-gap-analysis), or a general severity-ranked anti-pattern audit (use test-anti-patterns), fixing or rewriting assertions, or writing, fixing, or modernizing MSTest tests, assertions, or attributes (use writing-mstest-tests).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3988,3989,3992],{"name":3942,"slug":3943,"type":15},{"name":3990,"slug":3991,"type":15},"QA","qa",{"name":3993,"slug":3994,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":3997,"name":3997,"fn":3998,"description":3999,"org":4000,"tags":4001,"stars":25,"repoUrl":26,"updatedAt":4012},"author-component","create and review Blazor components","Create or review Blazor components (.razor files) with correct architecture. USE FOR: writing new Blazor components that do NOT involve JavaScript interop, implementing parameters and EventCallback, RenderFragment slots, component lifecycle (OnInitializedAsync, OnParametersSet), async patterns, IAsyncDisposable, CancellationToken, CSS isolation, code-behind. DO NOT USE FOR: creating new projects (use create-blazor-project), JavaScript interop or calling browser APIs from Blazor (use use-js-interop), forms and validation (use collect-user-input), prerendering issues (use support-prerendering), HTTP data fetching patterns (use fetch-and-send-data), coordinating state between unrelated components (use coordinate-components).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4002,4003,4006,4008,4009],{"name":17,"slug":18,"type":15},{"name":4004,"slug":4005,"type":15},"Blazor","blazor",{"name":4007,"slug":1599,"type":15},"C#",{"name":23,"slug":24,"type":15},{"name":4010,"slug":4011,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":4014,"name":4014,"fn":4015,"description":4016,"org":4017,"tags":4018,"stars":25,"repoUrl":26,"updatedAt":4022},"binlog-failure-analysis","analyze MSBuild binary logs","Analyze MSBuild binary logs to diagnose build failures. USE FOR: build errors that are unclear from console output, diagnosing cascading failures across multi-project builds, tracing MSBuild target execution order, and generally any MSBuild build issues. Requires an existing .binlog file. DO NOT USE FOR: generating binlogs (use binlog-generation), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4019,4020,4021],{"name":3942,"slug":3943,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3961,"slug":3962,"type":15},"2026-07-12T08:21:34.637923",{"slug":4024,"name":4024,"fn":4025,"description":4026,"org":4027,"tags":4028,"stars":25,"repoUrl":26,"updatedAt":4034},"binlog-generation","generate MSBuild binary logs for diagnostics","Generate MSBuild binary logs (binlogs) for build diagnostics and analysis. USE FOR: adding \u002Fbl:{} to any dotnet build, test, pack, publish, or restore command to capture a full build execution trace, prerequisite for binlog-failure-analysis and build-perf-diagnostics skills, enabling post-build investigation of errors or performance. Requires MSBuild 17.8+ \u002F .NET 8 SDK+ for {} placeholder; PowerShell needs -bl:{{}}. DO NOT USE FOR: non-MSBuild build systems (npm, Maven, CMake), analyzing an existing binlog (use binlog-failure-analysis instead).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4029,4032,4033],{"name":4030,"slug":4031,"type":15},"Build","build",{"name":3945,"slug":3946,"type":15},{"name":3926,"slug":3927,"type":15},"2026-07-19T05:38:19.340791",{"slug":4036,"name":4036,"fn":4037,"description":4038,"org":4039,"tags":4040,"stars":25,"repoUrl":26,"updatedAt":4044},"build-parallelism","optimize MSBuild build parallelism","Diagnose and fix under-parallelized MSBuild builds. USE WHEN a multi-project solution build is slower than expected, doesn't speed up when you add cores, pegs a single core while others idle, or you want to know why `-m` isn't helping. Note: `\u002Fmaxcpucount` default is 1 (sequential) — always pass `-m` for parallel builds. Covers finding the critical path (longest serial ProjectReference chain), graph build (`\u002Fgraph`), BuildInParallel, and solution filters (`.slnf`). DO NOT USE FOR: single-project builds, incremental issues (use incremental-build), compilation slowness inside one project (use build-perf-diagnostics), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4041,4042,4043],{"name":17,"slug":18,"type":15},{"name":3926,"slug":3927,"type":15},{"name":3929,"slug":3930,"type":15},"2026-07-19T05:38:18.364937",{"slug":4046,"name":4046,"fn":4047,"description":4048,"org":4049,"tags":4050,"stars":25,"repoUrl":26,"updatedAt":4057},"build-perf-baseline","establish and optimize build performance baselines","Establish build performance baselines and apply systematic optimization techniques. USE FOR: diagnosing slow builds, establishing before\u002Fafter measurements (cold, warm, no-op scenarios), applying optimization strategies like MSBuild Server, static graph builds, artifacts output, and dependency graph trimming. Start here before diving into build-perf-diagnostics, incremental-build, or build-parallelism. DO NOT USE FOR: non-MSBuild build systems, detailed bottleneck analysis (use build-perf-diagnostics after baselining).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4051,4052,4055,4056],{"name":3926,"slug":3927,"type":15},{"name":4053,"slug":4054,"type":15},"Monitoring","monitoring",{"name":3929,"slug":3930,"type":15},{"name":3993,"slug":3994,"type":15},"2026-07-12T08:21:35.865649",{"slug":4059,"name":4059,"fn":4060,"description":4061,"org":4062,"tags":4063,"stars":25,"repoUrl":26,"updatedAt":4068},"build-perf-diagnostics","diagnose MSBuild build performance bottlenecks","Diagnose MSBuild build performance bottlenecks using binary log analysis. USE FOR: identifying why builds are slow by analyzing binlog performance summaries, detecting ResolveAssemblyReference (RAR) taking >5s, Roslyn analyzers consuming >30% of Csc time, single targets dominating >50% of build time, node utilization below 80%, excessive Copy tasks, NuGet restore running every build. Covers timeline analysis, Target\u002FTask Performance Summary interpretation, and 7 common bottleneck categories. Use after build-perf-baseline has established measurements. DO NOT USE FOR: establishing initial baselines (use build-perf-baseline first), fixing incremental build issues (use incremental-build), parallelism tuning (use build-parallelism), non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4064,4065,4066,4067],{"name":17,"slug":18,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3926,"slug":3927,"type":15},{"name":3929,"slug":3930,"type":15},"2026-07-12T08:21:40.961722",{"slug":4070,"name":4070,"fn":4071,"description":4072,"org":4073,"tags":4074,"stars":25,"repoUrl":26,"updatedAt":4078},"check-bin-obj-clash","detect MSBuild output path conflicts","Detects MSBuild projects with conflicting OutputPath or IntermediateOutputPath. USE FOR: builds failing with 'Cannot create a file when that file already exists', 'The process cannot access the file because it is being used by another process', intermittent build failures that succeed on retry, or missing\u002Foverwritten outputs in multi-project or multi-targeting builds where bin\u002Fobj (or project.assets.json) collide. Common causes: shared OutputPath, missing AppendTargetFrameworkToOutputPath, extra global properties (e.g. PublishReadyToRun), or SetTargetFramework on a ProjectReference to a single-targeting project. DO NOT USE FOR: file access errors unrelated to MSBuild (OS-level locking), single-project single-TFM builds, non-MSBuild build systems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4075,4076,4077],{"name":3945,"slug":3946,"type":15},{"name":3926,"slug":3927,"type":15},{"name":3990,"slug":3991,"type":15},"2026-07-19T05:38:14.336279",144,{"items":4081,"total":4130},[4082,4089,4096,4104,4110,4118,4124],{"slug":3935,"name":3935,"fn":3936,"description":3937,"org":4083,"tags":4084,"stars":25,"repoUrl":26,"updatedAt":3948},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4085,4086,4087,4088],{"name":17,"slug":18,"type":15},{"name":3942,"slug":3943,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3929,"slug":3930,"type":15},{"slug":3950,"name":3950,"fn":3951,"description":3952,"org":4090,"tags":4091,"stars":25,"repoUrl":26,"updatedAt":3963},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4092,4093,4094,4095],{"name":17,"slug":18,"type":15},{"name":3957,"slug":3958,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3961,"slug":3962,"type":15},{"slug":3965,"name":3965,"fn":3966,"description":3967,"org":4097,"tags":4098,"stars":25,"repoUrl":26,"updatedAt":3981},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4099,4100,4101,4102,4103],{"name":17,"slug":18,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3973,"slug":3974,"type":15},{"name":3976,"slug":3977,"type":15},{"name":3979,"slug":3980,"type":15},{"slug":3983,"name":3983,"fn":3984,"description":3985,"org":4105,"tags":4106,"stars":25,"repoUrl":26,"updatedAt":3995},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4107,4108,4109],{"name":3942,"slug":3943,"type":15},{"name":3990,"slug":3991,"type":15},{"name":3993,"slug":3994,"type":15},{"slug":3997,"name":3997,"fn":3998,"description":3999,"org":4111,"tags":4112,"stars":25,"repoUrl":26,"updatedAt":4012},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4113,4114,4115,4116,4117],{"name":17,"slug":18,"type":15},{"name":4004,"slug":4005,"type":15},{"name":4007,"slug":1599,"type":15},{"name":23,"slug":24,"type":15},{"name":4010,"slug":4011,"type":15},{"slug":4014,"name":4014,"fn":4015,"description":4016,"org":4119,"tags":4120,"stars":25,"repoUrl":26,"updatedAt":4022},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4121,4122,4123],{"name":3942,"slug":3943,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3961,"slug":3962,"type":15},{"slug":4024,"name":4024,"fn":4025,"description":4026,"org":4125,"tags":4126,"stars":25,"repoUrl":26,"updatedAt":4034},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4127,4128,4129],{"name":4030,"slug":4031,"type":15},{"name":3945,"slug":3946,"type":15},{"name":3926,"slug":3927,"type":15},96]