[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-dotnet-maui-data-binding":3,"mdc-f57wlr-key":37,"related-org-dotnet-maui-data-binding":3121,"related-repo-dotnet-maui-data-binding":3288},{"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-data-binding","implement MAUI data binding patterns","Guidance for .NET MAUI XAML and C# data bindings — compiled bindings, INotifyPropertyChanged \u002F ObservableObject, value converters, binding modes, multi-binding, relative bindings, fallbacks, and MVVM best practices. USE FOR: setting up compiled bindings with x:DataType, implementing INotifyPropertyChanged or CommunityToolkit ObservableObject, creating IValueConverter \u002F IMultiValueConverter, choosing binding modes, configuring BindingContext, relative bindings, binding fallbacks, StringFormat, code-behind SetBinding with lambdas, and enforcing XC0022\u002FXC0025 warnings. DO NOT USE FOR: CollectionView item templates and layouts (use maui-collectionview), Shell navigation data passing (use maui-shell-navigation), dependency injection (use maui-dependency-injection), or animations triggered by property changes (use .NET MAUI animation APIs).",{"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},"C#","csharp","tag",{"name":17,"slug":18,"type":15},"MAUI","maui",{"name":20,"slug":21,"type":15},"Mobile","mobile",{"name":23,"slug":24,"type":15},"State Management","state-management",4576,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fskills","2026-08-01T05:42:15.342496","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-data-binding","---\nname: maui-data-binding\ndescription: >-\n  Guidance for .NET MAUI XAML and C# data bindings — compiled bindings,\n  INotifyPropertyChanged \u002F ObservableObject, value converters, binding modes,\n  multi-binding, relative bindings, fallbacks, and MVVM best practices.\n  USE FOR: setting up compiled bindings with x:DataType, implementing\n  INotifyPropertyChanged or CommunityToolkit ObservableObject, creating\n  IValueConverter \u002F IMultiValueConverter, choosing binding modes, configuring\n  BindingContext, relative bindings, binding fallbacks, StringFormat,\n  code-behind SetBinding with lambdas, and enforcing XC0022\u002FXC0025 warnings.\n  DO NOT USE FOR: CollectionView item templates and layouts (use\n  maui-collectionview), Shell navigation data passing (use\n  maui-shell-navigation), dependency injection (use maui-dependency-injection),\n  or animations triggered by property changes (use .NET MAUI animation APIs).\nlicense: MIT\n---\n\n# .NET MAUI Data Binding\n\nWire UI controls to ViewModel properties with compile-time safety, correct\nchange notification, and minimal overhead. Prefer compiled bindings everywhere\nand treat binding warnings as build errors.\n\n## When to Use\n\n- Adding `x:DataType` compiled bindings to a new or existing page\n- Implementing `INotifyPropertyChanged` or CommunityToolkit `ObservableObject`\n- Creating or consuming `IValueConverter` \u002F `IMultiValueConverter`\n- Choosing the correct `BindingMode` for a control property\n- Setting `BindingContext` in XAML or code-behind\n- Using relative bindings (`Self`, `AncestorType`, `TemplatedParent`)\n- Applying `StringFormat`, `FallbackValue`, or `TargetNullValue`\n- Writing AOT-safe code bindings with `SetBinding` and lambdas (.NET 9+)\n\n## When Not to Use\n\n- **CollectionView layouts \u002F templates** — use the `maui-collectionview` skill\n- **Shell navigation parameters** — use the `maui-shell-navigation` skill\n- **Service registration \u002F DI** — use the `maui-dependency-injection` skill\n- **Property-change-triggered animations** — use built-in [.NET MAUI animation APIs](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fanimation\u002Fbasic)\n\n## Inputs\n\n- A .NET MAUI project targeting .NET 8 or later\n- XAML pages or C# code-behind where bindings are declared\n- A ViewModel class (or plan to create one)\n\n## Rules That Change the Answer\n\nApply these to every binding answer — they are the differences between \"it compiles\"\nand \"it actually updates the UI\".\n\n| Situation | Do this | Not this |\n|---|---|---|\n| Deciding where `x:DataType` goes | Put it wherever a binding scope starts — the page\u002Fview root, and **each** `DataTemplate` | Scattering it on arbitrary children that share the parent's `BindingContext` |\n| A binding falls back to reflection (XC0022 \u002F XC0023) | Add the right `x:DataType` for that binding scope; for XC0023 remove the explicit `x:DataType=\"{x:Null}\"` | `x:DataType=\"x:Object\"` to silence it — this disables compile-time checking |\n| A `DataTemplate` inherits `x:DataType` from an outer scope (XC0024) | Give the `DataTemplate` its **own** `x:DataType` | Leaving it to resolve against the wrong type |\n| ViewModel change notification | `ObservableObject` + `[ObservableProperty]`, or implement `INotifyPropertyChanged` | A plain POCO base class — bindings will never update |\n| Bindings show blank | Check `BindingContext` is actually set | Assuming the binding path is wrong |\n| Enforcing compiled bindings | Set `MauiEnableXamlCBindingWithSourceCompilation` to `true`, **then** `\u003CWarningsAsErrors>XC0022;XC0025\u003C\u002FWarningsAsErrors>` | Promoting `XC0025` without the switch if the project uses `Source=` \u002F `RelativeSource` bindings |\n\n**Do not** restructure a ViewModel or add a converter that the user did not ask for\nand that fixes no real defect. Adding `x:DataType` is different: when you are\nalready editing a page's bindings, recommending compiled bindings is in scope.\n\n---\n\n## Compiled Bindings — x:DataType Placement\n\nCompiled bindings are **8–20× faster** than reflection-based bindings and are\nrequired for NativeAOT \u002F trimming. Enable them with `x:DataType`.\n\n### Placement rules\n\nSet `x:DataType` **only where `BindingContext` is set**:\n\n1. **Page \u002F View root** — where you assign `BindingContext`.\n2. **DataTemplate** — which creates a new binding scope.\n\nDo **not** scatter `x:DataType` on arbitrary child elements. Adding\n`x:DataType=\"x:Object\"` on children to escape compiled bindings is an\nanti-pattern — it disables compile-time checking and reintroduces reflection.\n\n```xml\n\u003C!-- ✅ Correct: x:DataType at the page root -->\n\u003CContentPage xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n             x:DataType=\"vm:MainViewModel\">\n    \u003CStackLayout>\n        \u003CLabel Text=\"{Binding Title}\" \u002F>\n        \u003CSlider Value=\"{Binding Progress}\" \u002F>\n    \u003C\u002FStackLayout>\n\u003C\u002FContentPage>\n\n\u003C!-- ❌ Wrong: x:DataType scattered on children -->\n\u003CContentPage x:DataType=\"vm:MainViewModel\">\n    \u003CStackLayout>\n        \u003CLabel Text=\"{Binding Title}\" \u002F>\n        \u003CSlider x:DataType=\"x:Object\" Value=\"{Binding Progress}\" \u002F>\n    \u003C\u002FStackLayout>\n\u003C\u002FContentPage>\n```\n\n### DataTemplate always needs its own x:DataType\n\n```xml\n\u003CCollectionView ItemsSource=\"{Binding People}\">\n    \u003CCollectionView.ItemTemplate>\n        \u003CDataTemplate x:DataType=\"model:Person\">\n            \u003CLabel Text=\"{Binding FullName}\" \u002F>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.ItemTemplate>\n\u003C\u002FCollectionView>\n```\n\n### Enforce binding warnings as errors\n\n| Warning | Meaning |\n|---------|---------|\n| **XC0022** | Binding used **without `x:DataType` in scope** — not compiled, falls back to reflection |\n| **XC0023** | Binding not compiled because `x:DataType` is **explicitly `null`** |\n| **XC0024** | `x:DataType` came from an **outer scope** — annotate the `DataTemplate` with its own `x:DataType` |\n| **XC0025** | Binding not compiled because it has an explicit **`Source`** — enable `\u003CMauiEnableXamlCBindingWithSourceCompilation>` |\n\n> These four codes are **verified against .NET 10 \u002F .NET 11 MAUI**\n> (`Build.Tasks\u002FBuildException.cs`, `ErrorMessages.resx`). Diagnostic numbering is\n> SDK-band-sensitive — re-check against `BuildException.cs` before relying on it on a\n> newer SDK.\n\nAdd to the `.csproj`:\n\n```xml\n\u003C!-- Compile bindings that use Source= as well; otherwise XC0025 fires on every\n     Source= \u002F RelativeSource binding. As of .NET 10\u002F11 this is on by default\n     only for AOT \u002F full-trim builds. -->\n\u003CMauiEnableXamlCBindingWithSourceCompilation>true\u003C\u002FMauiEnableXamlCBindingWithSourceCompilation>\n\u003CWarningsAsErrors>XC0022;XC0025\u003C\u002FWarningsAsErrors>\n```\n\nIf you promote `XC0025` without enabling that switch, make sure the project has no\n`Source=` \u002F `RelativeSource` bindings — otherwise they will be reported.\n\n---\n\n## Binding Modes\n\nSet `Mode` explicitly **only** when overriding the default. Most properties\nalready have the correct default:\n\n| Mode | Direction | Use case |\n|------|-----------|----------|\n| `OneWay` | Source → Target | Display-only (default for most properties) |\n| `TwoWay` | Source ↔ Target | Editable controls (`Entry.Text`, `Switch.IsToggled`) |\n| `OneWayToSource` | Target → Source | Read user input without pushing back to UI |\n| `OneTime` | Source → Target (once) | Static values; no change-tracking overhead |\n\n```xml\n\u003C!-- ✅ Defaults — omit Mode -->\n\u003CLabel Text=\"{Binding Score}\" \u002F>\n\u003CEntry Text=\"{Binding UserName}\" \u002F>\n\u003CSwitch IsToggled=\"{Binding DarkMode}\" \u002F>\n\n\u003C!-- ✅ Override only when needed -->\n\u003CLabel Text=\"{Binding Title, Mode=OneTime}\" \u002F>\n\u003CEntry Text=\"{Binding SearchQuery, Mode=OneWayToSource}\" \u002F>\n\n\u003C!-- ❌ Redundant — adds noise -->\n\u003CLabel Text=\"{Binding Score, Mode=OneWay}\" \u002F>\n\u003CEntry Text=\"{Binding UserName, Mode=TwoWay}\" \u002F>\n```\n\n---\n\n## BindingContext and Property Paths\n\nEvery `BindableObject` inherits `BindingContext` from its parent unless\nexplicitly set. Property paths support dot notation and indexers:\n\n```xml\n\u003CLabel Text=\"{Binding Address.City}\" \u002F>\n\u003CLabel Text=\"{Binding Items[0].Name}\" \u002F>\n```\n\nSet `BindingContext` in XAML:\n\n```xml\n\u003CContentPage xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n             x:DataType=\"vm:MainViewModel\">\n    \u003CContentPage.BindingContext>\n        \u003Cvm:MainViewModel \u002F>\n    \u003C\u002FContentPage.BindingContext>\n\u003C\u002FContentPage>\n```\n\nOr in code-behind (preferred with DI):\n\n```csharp\npublic MainPage(MainViewModel vm)\n{\n    InitializeComponent();\n    BindingContext = vm;\n}\n```\n\n---\n\n## INotifyPropertyChanged and ObservableObject\n\n### Manual implementation\n\n```csharp\npublic class MainViewModel : INotifyPropertyChanged\n{\n    public event PropertyChangedEventHandler? PropertyChanged;\n\n    private string _title = string.Empty;\n    public string Title\n    {\n        get => _title;\n        set\n        {\n            if (_title != value)\n            {\n                _title = value;\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));\n            }\n        }\n    }\n}\n```\n\n### CommunityToolkit.Mvvm (recommended)\n\n```csharp\nusing CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\n\npublic partial class MainViewModel : ObservableObject\n{\n    [ObservableProperty]\n    private string _title = string.Empty;\n\n    [RelayCommand]\n    private async Task LoadDataAsync() { \u002F* ... *\u002F }\n}\n```\n\nThe source generator creates the `Title` property, `PropertyChanged` raise,\nand `LoadDataCommand` automatically.\n\n---\n\n## Value Converters — IValueConverter\n\nImplement `Convert` (source → target) and `ConvertBack` (target → source):\n\n```csharp\npublic class IntToBoolConverter : IValueConverter\n{\n    public object? Convert(object? value, Type targetType,\n        object? parameter, CultureInfo culture)\n        => value is int i && i != 0;\n\n    public object? ConvertBack(object? value, Type targetType,\n        object? parameter, CultureInfo culture)\n        => value is true ? 1 : 0;\n}\n```\n\nDeclare in XAML resources and consume:\n\n```xml\n\u003CContentPage.Resources>\n    \u003Clocal:IntToBoolConverter x:Key=\"IntToBool\" \u002F>\n\u003C\u002FContentPage.Resources>\n\n\u003CSwitch IsToggled=\"{Binding Count, Converter={StaticResource IntToBool}}\" \u002F>\n```\n\n`ConverterParameter` is always passed as a **string** — parse inside `Convert`:\n\n```xml\n\u003CLabel Text=\"{Binding Score, Converter={StaticResource ThresholdConverter},\n              ConverterParameter=50}\" \u002F>\n```\n\n---\n\n## Multi-Binding\n\nCombine multiple source values with `IMultiValueConverter`:\n\n```xml\n\u003CLabel>\n    \u003CLabel.Text>\n        \u003CMultiBinding Converter=\"{StaticResource FullNameConverter}\">\n            \u003CBinding Path=\"FirstName\" \u002F>\n            \u003CBinding Path=\"LastName\" \u002F>\n        \u003C\u002FMultiBinding>\n    \u003C\u002FLabel.Text>\n\u003C\u002FLabel>\n```\n\n```csharp\npublic class FullNameConverter : IMultiValueConverter\n{\n    public object Convert(object[] values, Type targetType,\n        object parameter, CultureInfo culture)\n    {\n        if (values.Length == 2 && values[0] is string first\n            && values[1] is string last)\n            return $\"{first} {last}\";\n        return string.Empty;\n    }\n\n    public object[] ConvertBack(object value, Type[] targetTypes,\n        object parameter, CultureInfo culture)\n        => throw new NotSupportedException();\n}\n```\n\n---\n\n## Relative Bindings\n\n| Source | Syntax | Use case |\n|--------|--------|----------|\n| Self | `{Binding Source={RelativeSource Self}, Path=WidthRequest}` | Bind to own properties |\n| Ancestor | `{Binding BindingContext.Title, Source={RelativeSource AncestorType={x:Type ContentPage}}}` | Reach parent BindingContext |\n| TemplatedParent | `{Binding Source={RelativeSource TemplatedParent}, Path=Padding}` | Inside ControlTemplate |\n\n```xml\n\u003C!-- Square box: Height = Width -->\n\u003CBoxView WidthRequest=\"100\"\n         HeightRequest=\"{Binding Source={RelativeSource Self}, Path=WidthRequest}\" \u002F>\n```\n\n---\n\n## StringFormat\n\nUse `Binding.StringFormat` for simple display formatting without a converter:\n\n```xml\n\u003CLabel Text=\"{Binding Price, StringFormat='Total: {0:C2}'}\" \u002F>\n\u003CLabel Text=\"{Binding DueDate, StringFormat='{0:MMM dd, yyyy}'}\" \u002F>\n```\n\nWrap the format string in single quotes when it contains commas or braces.\n\n---\n\n## Binding Fallbacks\n\n- **FallbackValue** — used when the binding path cannot be resolved or the\n  converter throws.\n- **TargetNullValue** — used when the bound value is `null`.\n\n```xml\n\u003CLabel Text=\"{Binding MiddleName, TargetNullValue='(none)',\n              FallbackValue='unavailable'}\" \u002F>\n\u003CImage Source=\"{Binding AvatarUrl, TargetNullValue='default_avatar.png'}\" \u002F>\n```\n\n---\n\n## .NET 9+ Code Bindings (AOT-safe)\n\nFully AOT-safe, no reflection:\n\n```csharp\nlabel.SetBinding(Label.TextProperty,\n    static (PersonViewModel vm) => vm.FullName);\n\nentry.SetBinding(Entry.TextProperty,\n    static (PersonViewModel vm) => vm.Age,\n    mode: BindingMode.TwoWay,\n    converter: new IntToStringConverter());\n```\n\n---\n\n## Threading\n\nMAUI automatically marshals `PropertyChanged` to the UI thread — you can raise\nit from any thread. **However**, direct `ObservableCollection` mutations\n(Add \u002F Remove) from background threads may crash:\n\n```csharp\n\u002F\u002F ✅ Safe — PropertyChanged is auto-marshalled\nawait Task.Run(() => Title = \"Loaded\");\n\n\u002F\u002F ⚠️ ObservableCollection.Add — dispatch to UI thread\nMainThread.BeginInvokeOnMainThread(() => Items.Add(newItem));\n```\n\n---\n\n## Common Pitfalls\n\n| Mistake | Fix |\n|---------|-----|\n| Missing `x:DataType` — bindings silently fall back to reflection | Add `x:DataType` at page root and every `DataTemplate`; promote `XC0022` (see [Enforce binding warnings as errors](#enforce-binding-warnings-as-errors)) |\n| Forgetting to set `BindingContext` | Set in XAML (`\u003CPage.BindingContext>`) or inject via constructor |\n| Specifying redundant `Mode=OneWay` \u002F `Mode=TwoWay` | Omit `Mode` when using the control's default |\n| ViewModel does not implement `INotifyPropertyChanged` | Use `ObservableObject` from CommunityToolkit.Mvvm or implement manually |\n| Mutating `ObservableCollection` off the UI thread | Wrap mutations in `MainThread.BeginInvokeOnMainThread` |\n| Complex converter chains in hot paths | Pre-compute values in the ViewModel instead |\n| Using `x:DataType=\"x:Object\"` to escape compiled bindings | Restructure bindings; keep compile-time safety |\n| Binding to non-public properties | Binding targets must be `public` properties (fields are ignored) |\n\n---\n\n## References\n\n- [Data binding overview](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002F)\n- [Compiled bindings](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Fcompiled-bindings)\n- [Value converters](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Fconverters)\n- [Relative bindings](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Frelative-bindings)\n- [Multi-bindings](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Fmultibindings)\n- [CommunityToolkit.Mvvm](https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcommunitytoolkit\u002Fmvvm\u002F)\n",{"data":38,"body":39},{"name":4,"description":6,"license":28},{"type":40,"children":41},"root",[42,51,57,64,214,220,293,299,317,323,328,620,637,641,647,666,673,697,726,752,906,912,975,981,1139,1178,1190,1237,1262,1265,1271,1290,1418,1519,1522,1528,1547,1570,1581,1633,1638,1686,1689,1695,1701,1851,1857,1947,1976,1979,1985,2006,2089,2094,2140,2164,2187,2190,2196,2207,2278,2399,2402,2408,2497,2528,2531,2536,2549,2572,2577,2580,2586,2613,2644,2647,2653,2658,2720,2723,2729,2756,2802,2805,2811,3043,3046,3052,3115],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"net-maui-data-binding",[48],{"type":49,"value":50},"text",".NET MAUI Data Binding",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Wire UI controls to ViewModel properties with compile-time safety, correct\nchange notification, and minimal overhead. Prefer compiled bindings everywhere\nand treat binding warnings as build errors.",{"type":43,"tag":58,"props":59,"children":61},"h2",{"id":60},"when-to-use",[62],{"type":49,"value":63},"When to Use",{"type":43,"tag":65,"props":66,"children":67},"ul",{},[68,83,102,121,134,147,175,201],{"type":43,"tag":69,"props":70,"children":71},"li",{},[72,74,81],{"type":49,"value":73},"Adding ",{"type":43,"tag":75,"props":76,"children":78},"code",{"className":77},[],[79],{"type":49,"value":80},"x:DataType",{"type":49,"value":82}," compiled bindings to a new or existing page",{"type":43,"tag":69,"props":84,"children":85},{},[86,88,94,96],{"type":49,"value":87},"Implementing ",{"type":43,"tag":75,"props":89,"children":91},{"className":90},[],[92],{"type":49,"value":93},"INotifyPropertyChanged",{"type":49,"value":95}," or CommunityToolkit ",{"type":43,"tag":75,"props":97,"children":99},{"className":98},[],[100],{"type":49,"value":101},"ObservableObject",{"type":43,"tag":69,"props":103,"children":104},{},[105,107,113,115],{"type":49,"value":106},"Creating or consuming ",{"type":43,"tag":75,"props":108,"children":110},{"className":109},[],[111],{"type":49,"value":112},"IValueConverter",{"type":49,"value":114}," \u002F ",{"type":43,"tag":75,"props":116,"children":118},{"className":117},[],[119],{"type":49,"value":120},"IMultiValueConverter",{"type":43,"tag":69,"props":122,"children":123},{},[124,126,132],{"type":49,"value":125},"Choosing the correct ",{"type":43,"tag":75,"props":127,"children":129},{"className":128},[],[130],{"type":49,"value":131},"BindingMode",{"type":49,"value":133}," for a control property",{"type":43,"tag":69,"props":135,"children":136},{},[137,139,145],{"type":49,"value":138},"Setting ",{"type":43,"tag":75,"props":140,"children":142},{"className":141},[],[143],{"type":49,"value":144},"BindingContext",{"type":49,"value":146}," in XAML or code-behind",{"type":43,"tag":69,"props":148,"children":149},{},[150,152,158,160,166,167,173],{"type":49,"value":151},"Using relative bindings (",{"type":43,"tag":75,"props":153,"children":155},{"className":154},[],[156],{"type":49,"value":157},"Self",{"type":49,"value":159},", ",{"type":43,"tag":75,"props":161,"children":163},{"className":162},[],[164],{"type":49,"value":165},"AncestorType",{"type":49,"value":159},{"type":43,"tag":75,"props":168,"children":170},{"className":169},[],[171],{"type":49,"value":172},"TemplatedParent",{"type":49,"value":174},")",{"type":43,"tag":69,"props":176,"children":177},{},[178,180,186,187,193,195],{"type":49,"value":179},"Applying ",{"type":43,"tag":75,"props":181,"children":183},{"className":182},[],[184],{"type":49,"value":185},"StringFormat",{"type":49,"value":159},{"type":43,"tag":75,"props":188,"children":190},{"className":189},[],[191],{"type":49,"value":192},"FallbackValue",{"type":49,"value":194},", or ",{"type":43,"tag":75,"props":196,"children":198},{"className":197},[],[199],{"type":49,"value":200},"TargetNullValue",{"type":43,"tag":69,"props":202,"children":203},{},[204,206,212],{"type":49,"value":205},"Writing AOT-safe code bindings with ",{"type":43,"tag":75,"props":207,"children":209},{"className":208},[],[210],{"type":49,"value":211},"SetBinding",{"type":49,"value":213}," and lambdas (.NET 9+)",{"type":43,"tag":58,"props":215,"children":217},{"id":216},"when-not-to-use",[218],{"type":49,"value":219},"When Not to Use",{"type":43,"tag":65,"props":221,"children":222},{},[223,242,258,274],{"type":43,"tag":69,"props":224,"children":225},{},[226,232,234,240],{"type":43,"tag":227,"props":228,"children":229},"strong",{},[230],{"type":49,"value":231},"CollectionView layouts \u002F templates",{"type":49,"value":233}," — use the ",{"type":43,"tag":75,"props":235,"children":237},{"className":236},[],[238],{"type":49,"value":239},"maui-collectionview",{"type":49,"value":241}," skill",{"type":43,"tag":69,"props":243,"children":244},{},[245,250,251,257],{"type":43,"tag":227,"props":246,"children":247},{},[248],{"type":49,"value":249},"Shell navigation parameters",{"type":49,"value":233},{"type":43,"tag":75,"props":252,"children":254},{"className":253},[],[255],{"type":49,"value":256},"maui-shell-navigation",{"type":49,"value":241},{"type":43,"tag":69,"props":259,"children":260},{},[261,266,267,273],{"type":43,"tag":227,"props":262,"children":263},{},[264],{"type":49,"value":265},"Service registration \u002F DI",{"type":49,"value":233},{"type":43,"tag":75,"props":268,"children":270},{"className":269},[],[271],{"type":49,"value":272},"maui-dependency-injection",{"type":49,"value":241},{"type":43,"tag":69,"props":275,"children":276},{},[277,282,284],{"type":43,"tag":227,"props":278,"children":279},{},[280],{"type":49,"value":281},"Property-change-triggered animations",{"type":49,"value":283}," — use built-in ",{"type":43,"tag":285,"props":286,"children":290},"a",{"href":287,"rel":288},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Fuser-interface\u002Fanimation\u002Fbasic",[289],"nofollow",[291],{"type":49,"value":292},".NET MAUI animation APIs",{"type":43,"tag":58,"props":294,"children":296},{"id":295},"inputs",[297],{"type":49,"value":298},"Inputs",{"type":43,"tag":65,"props":300,"children":301},{},[302,307,312],{"type":43,"tag":69,"props":303,"children":304},{},[305],{"type":49,"value":306},"A .NET MAUI project targeting .NET 8 or later",{"type":43,"tag":69,"props":308,"children":309},{},[310],{"type":49,"value":311},"XAML pages or C# code-behind where bindings are declared",{"type":43,"tag":69,"props":313,"children":314},{},[315],{"type":49,"value":316},"A ViewModel class (or plan to create one)",{"type":43,"tag":58,"props":318,"children":320},{"id":319},"rules-that-change-the-answer",[321],{"type":49,"value":322},"Rules That Change the Answer",{"type":43,"tag":52,"props":324,"children":325},{},[326],{"type":49,"value":327},"Apply these to every binding answer — they are the differences between \"it compiles\"\nand \"it actually updates the UI\".",{"type":43,"tag":329,"props":330,"children":331},"table",{},[332,356],{"type":43,"tag":333,"props":334,"children":335},"thead",{},[336],{"type":43,"tag":337,"props":338,"children":339},"tr",{},[340,346,351],{"type":43,"tag":341,"props":342,"children":343},"th",{},[344],{"type":49,"value":345},"Situation",{"type":43,"tag":341,"props":347,"children":348},{},[349],{"type":49,"value":350},"Do this",{"type":43,"tag":341,"props":352,"children":353},{},[354],{"type":49,"value":355},"Not this",{"type":43,"tag":357,"props":358,"children":359},"tbody",{},[360,404,441,491,527,552],{"type":43,"tag":337,"props":361,"children":362},{},[363,376,394],{"type":43,"tag":364,"props":365,"children":366},"td",{},[367,369,374],{"type":49,"value":368},"Deciding where ",{"type":43,"tag":75,"props":370,"children":372},{"className":371},[],[373],{"type":49,"value":80},{"type":49,"value":375}," goes",{"type":43,"tag":364,"props":377,"children":378},{},[379,381,386,388],{"type":49,"value":380},"Put it wherever a binding scope starts — the page\u002Fview root, and ",{"type":43,"tag":227,"props":382,"children":383},{},[384],{"type":49,"value":385},"each",{"type":49,"value":387}," ",{"type":43,"tag":75,"props":389,"children":391},{"className":390},[],[392],{"type":49,"value":393},"DataTemplate",{"type":43,"tag":364,"props":395,"children":396},{},[397,399],{"type":49,"value":398},"Scattering it on arbitrary children that share the parent's ",{"type":43,"tag":75,"props":400,"children":402},{"className":401},[],[403],{"type":49,"value":144},{"type":43,"tag":337,"props":405,"children":406},{},[407,412,430],{"type":43,"tag":364,"props":408,"children":409},{},[410],{"type":49,"value":411},"A binding falls back to reflection (XC0022 \u002F XC0023)",{"type":43,"tag":364,"props":413,"children":414},{},[415,417,422,424],{"type":49,"value":416},"Add the right ",{"type":43,"tag":75,"props":418,"children":420},{"className":419},[],[421],{"type":49,"value":80},{"type":49,"value":423}," for that binding scope; for XC0023 remove the explicit ",{"type":43,"tag":75,"props":425,"children":427},{"className":426},[],[428],{"type":49,"value":429},"x:DataType=\"{x:Null}\"",{"type":43,"tag":364,"props":431,"children":432},{},[433,439],{"type":43,"tag":75,"props":434,"children":436},{"className":435},[],[437],{"type":49,"value":438},"x:DataType=\"x:Object\"",{"type":49,"value":440}," to silence it — this disables compile-time checking",{"type":43,"tag":337,"props":442,"children":443},{},[444,463,486],{"type":43,"tag":364,"props":445,"children":446},{},[447,449,454,456,461],{"type":49,"value":448},"A ",{"type":43,"tag":75,"props":450,"children":452},{"className":451},[],[453],{"type":49,"value":393},{"type":49,"value":455}," inherits ",{"type":43,"tag":75,"props":457,"children":459},{"className":458},[],[460],{"type":49,"value":80},{"type":49,"value":462}," from an outer scope (XC0024)",{"type":43,"tag":364,"props":464,"children":465},{},[466,468,473,475,480,481],{"type":49,"value":467},"Give the ",{"type":43,"tag":75,"props":469,"children":471},{"className":470},[],[472],{"type":49,"value":393},{"type":49,"value":474}," its ",{"type":43,"tag":227,"props":476,"children":477},{},[478],{"type":49,"value":479},"own",{"type":49,"value":387},{"type":43,"tag":75,"props":482,"children":484},{"className":483},[],[485],{"type":49,"value":80},{"type":43,"tag":364,"props":487,"children":488},{},[489],{"type":49,"value":490},"Leaving it to resolve against the wrong type",{"type":43,"tag":337,"props":492,"children":493},{},[494,499,522],{"type":43,"tag":364,"props":495,"children":496},{},[497],{"type":49,"value":498},"ViewModel change notification",{"type":43,"tag":364,"props":500,"children":501},{},[502,507,509,515,517],{"type":43,"tag":75,"props":503,"children":505},{"className":504},[],[506],{"type":49,"value":101},{"type":49,"value":508}," + ",{"type":43,"tag":75,"props":510,"children":512},{"className":511},[],[513],{"type":49,"value":514},"[ObservableProperty]",{"type":49,"value":516},", or implement ",{"type":43,"tag":75,"props":518,"children":520},{"className":519},[],[521],{"type":49,"value":93},{"type":43,"tag":364,"props":523,"children":524},{},[525],{"type":49,"value":526},"A plain POCO base class — bindings will never update",{"type":43,"tag":337,"props":528,"children":529},{},[530,535,547],{"type":43,"tag":364,"props":531,"children":532},{},[533],{"type":49,"value":534},"Bindings show blank",{"type":43,"tag":364,"props":536,"children":537},{},[538,540,545],{"type":49,"value":539},"Check ",{"type":43,"tag":75,"props":541,"children":543},{"className":542},[],[544],{"type":49,"value":144},{"type":49,"value":546}," is actually set",{"type":43,"tag":364,"props":548,"children":549},{},[550],{"type":49,"value":551},"Assuming the binding path is wrong",{"type":43,"tag":337,"props":553,"children":554},{},[555,560,592],{"type":43,"tag":364,"props":556,"children":557},{},[558],{"type":49,"value":559},"Enforcing compiled bindings",{"type":43,"tag":364,"props":561,"children":562},{},[563,565,571,573,579,580,585,586],{"type":49,"value":564},"Set ",{"type":43,"tag":75,"props":566,"children":568},{"className":567},[],[569],{"type":49,"value":570},"MauiEnableXamlCBindingWithSourceCompilation",{"type":49,"value":572}," to ",{"type":43,"tag":75,"props":574,"children":576},{"className":575},[],[577],{"type":49,"value":578},"true",{"type":49,"value":159},{"type":43,"tag":227,"props":581,"children":582},{},[583],{"type":49,"value":584},"then",{"type":49,"value":387},{"type":43,"tag":75,"props":587,"children":589},{"className":588},[],[590],{"type":49,"value":591},"\u003CWarningsAsErrors>XC0022;XC0025\u003C\u002FWarningsAsErrors>",{"type":43,"tag":364,"props":593,"children":594},{},[595,597,603,605,611,612,618],{"type":49,"value":596},"Promoting ",{"type":43,"tag":75,"props":598,"children":600},{"className":599},[],[601],{"type":49,"value":602},"XC0025",{"type":49,"value":604}," without the switch if the project uses ",{"type":43,"tag":75,"props":606,"children":608},{"className":607},[],[609],{"type":49,"value":610},"Source=",{"type":49,"value":114},{"type":43,"tag":75,"props":613,"children":615},{"className":614},[],[616],{"type":49,"value":617},"RelativeSource",{"type":49,"value":619}," bindings",{"type":43,"tag":52,"props":621,"children":622},{},[623,628,630,635],{"type":43,"tag":227,"props":624,"children":625},{},[626],{"type":49,"value":627},"Do not",{"type":49,"value":629}," restructure a ViewModel or add a converter that the user did not ask for\nand that fixes no real defect. Adding ",{"type":43,"tag":75,"props":631,"children":633},{"className":632},[],[634],{"type":49,"value":80},{"type":49,"value":636}," is different: when you are\nalready editing a page's bindings, recommending compiled bindings is in scope.",{"type":43,"tag":638,"props":639,"children":640},"hr",{},[],{"type":43,"tag":58,"props":642,"children":644},{"id":643},"compiled-bindings-xdatatype-placement",[645],{"type":49,"value":646},"Compiled Bindings — x:DataType Placement",{"type":43,"tag":52,"props":648,"children":649},{},[650,652,657,659,664],{"type":49,"value":651},"Compiled bindings are ",{"type":43,"tag":227,"props":653,"children":654},{},[655],{"type":49,"value":656},"8–20× faster",{"type":49,"value":658}," than reflection-based bindings and are\nrequired for NativeAOT \u002F trimming. Enable them with ",{"type":43,"tag":75,"props":660,"children":662},{"className":661},[],[663],{"type":49,"value":80},{"type":49,"value":665},".",{"type":43,"tag":667,"props":668,"children":670},"h3",{"id":669},"placement-rules",[671],{"type":49,"value":672},"Placement rules",{"type":43,"tag":52,"props":674,"children":675},{},[676,677,682,683,695],{"type":49,"value":564},{"type":43,"tag":75,"props":678,"children":680},{"className":679},[],[681],{"type":49,"value":80},{"type":49,"value":387},{"type":43,"tag":227,"props":684,"children":685},{},[686,688,693],{"type":49,"value":687},"only where ",{"type":43,"tag":75,"props":689,"children":691},{"className":690},[],[692],{"type":49,"value":144},{"type":49,"value":694}," is set",{"type":49,"value":696},":",{"type":43,"tag":698,"props":699,"children":700},"ol",{},[701,717],{"type":43,"tag":69,"props":702,"children":703},{},[704,709,711,716],{"type":43,"tag":227,"props":705,"children":706},{},[707],{"type":49,"value":708},"Page \u002F View root",{"type":49,"value":710}," — where you assign ",{"type":43,"tag":75,"props":712,"children":714},{"className":713},[],[715],{"type":49,"value":144},{"type":49,"value":665},{"type":43,"tag":69,"props":718,"children":719},{},[720,724],{"type":43,"tag":227,"props":721,"children":722},{},[723],{"type":49,"value":393},{"type":49,"value":725}," — which creates a new binding scope.",{"type":43,"tag":52,"props":727,"children":728},{},[729,731,736,738,743,745,750],{"type":49,"value":730},"Do ",{"type":43,"tag":227,"props":732,"children":733},{},[734],{"type":49,"value":735},"not",{"type":49,"value":737}," scatter ",{"type":43,"tag":75,"props":739,"children":741},{"className":740},[],[742],{"type":49,"value":80},{"type":49,"value":744}," on arbitrary child elements. Adding\n",{"type":43,"tag":75,"props":746,"children":748},{"className":747},[],[749],{"type":49,"value":438},{"type":49,"value":751}," on children to escape compiled bindings is an\nanti-pattern — it disables compile-time checking and reintroduces reflection.",{"type":43,"tag":753,"props":754,"children":759},"pre",{"className":755,"code":756,"language":757,"meta":758,"style":758},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!-- ✅ Correct: x:DataType at the page root -->\n\u003CContentPage xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n             x:DataType=\"vm:MainViewModel\">\n    \u003CStackLayout>\n        \u003CLabel Text=\"{Binding Title}\" \u002F>\n        \u003CSlider Value=\"{Binding Progress}\" \u002F>\n    \u003C\u002FStackLayout>\n\u003C\u002FContentPage>\n\n\u003C!-- ❌ Wrong: x:DataType scattered on children -->\n\u003CContentPage x:DataType=\"vm:MainViewModel\">\n    \u003CStackLayout>\n        \u003CLabel Text=\"{Binding Title}\" \u002F>\n        \u003CSlider x:DataType=\"x:Object\" Value=\"{Binding Progress}\" \u002F>\n    \u003C\u002FStackLayout>\n\u003C\u002FContentPage>\n","xml","",[760],{"type":43,"tag":75,"props":761,"children":762},{"__ignoreMap":758},[763,774,783,792,801,810,819,828,837,847,856,865,873,881,890,898],{"type":43,"tag":764,"props":765,"children":768},"span",{"class":766,"line":767},"line",1,[769],{"type":43,"tag":764,"props":770,"children":771},{},[772],{"type":49,"value":773},"\u003C!-- ✅ Correct: x:DataType at the page root -->\n",{"type":43,"tag":764,"props":775,"children":777},{"class":766,"line":776},2,[778],{"type":43,"tag":764,"props":779,"children":780},{},[781],{"type":49,"value":782},"\u003CContentPage xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n",{"type":43,"tag":764,"props":784,"children":786},{"class":766,"line":785},3,[787],{"type":43,"tag":764,"props":788,"children":789},{},[790],{"type":49,"value":791},"             x:DataType=\"vm:MainViewModel\">\n",{"type":43,"tag":764,"props":793,"children":795},{"class":766,"line":794},4,[796],{"type":43,"tag":764,"props":797,"children":798},{},[799],{"type":49,"value":800},"    \u003CStackLayout>\n",{"type":43,"tag":764,"props":802,"children":804},{"class":766,"line":803},5,[805],{"type":43,"tag":764,"props":806,"children":807},{},[808],{"type":49,"value":809},"        \u003CLabel Text=\"{Binding Title}\" \u002F>\n",{"type":43,"tag":764,"props":811,"children":813},{"class":766,"line":812},6,[814],{"type":43,"tag":764,"props":815,"children":816},{},[817],{"type":49,"value":818},"        \u003CSlider Value=\"{Binding Progress}\" \u002F>\n",{"type":43,"tag":764,"props":820,"children":822},{"class":766,"line":821},7,[823],{"type":43,"tag":764,"props":824,"children":825},{},[826],{"type":49,"value":827},"    \u003C\u002FStackLayout>\n",{"type":43,"tag":764,"props":829,"children":831},{"class":766,"line":830},8,[832],{"type":43,"tag":764,"props":833,"children":834},{},[835],{"type":49,"value":836},"\u003C\u002FContentPage>\n",{"type":43,"tag":764,"props":838,"children":840},{"class":766,"line":839},9,[841],{"type":43,"tag":764,"props":842,"children":844},{"emptyLinePlaceholder":843},true,[845],{"type":49,"value":846},"\n",{"type":43,"tag":764,"props":848,"children":850},{"class":766,"line":849},10,[851],{"type":43,"tag":764,"props":852,"children":853},{},[854],{"type":49,"value":855},"\u003C!-- ❌ Wrong: x:DataType scattered on children -->\n",{"type":43,"tag":764,"props":857,"children":859},{"class":766,"line":858},11,[860],{"type":43,"tag":764,"props":861,"children":862},{},[863],{"type":49,"value":864},"\u003CContentPage x:DataType=\"vm:MainViewModel\">\n",{"type":43,"tag":764,"props":866,"children":868},{"class":766,"line":867},12,[869],{"type":43,"tag":764,"props":870,"children":871},{},[872],{"type":49,"value":800},{"type":43,"tag":764,"props":874,"children":876},{"class":766,"line":875},13,[877],{"type":43,"tag":764,"props":878,"children":879},{},[880],{"type":49,"value":809},{"type":43,"tag":764,"props":882,"children":884},{"class":766,"line":883},14,[885],{"type":43,"tag":764,"props":886,"children":887},{},[888],{"type":49,"value":889},"        \u003CSlider x:DataType=\"x:Object\" Value=\"{Binding Progress}\" \u002F>\n",{"type":43,"tag":764,"props":891,"children":893},{"class":766,"line":892},15,[894],{"type":43,"tag":764,"props":895,"children":896},{},[897],{"type":49,"value":827},{"type":43,"tag":764,"props":899,"children":901},{"class":766,"line":900},16,[902],{"type":43,"tag":764,"props":903,"children":904},{},[905],{"type":49,"value":836},{"type":43,"tag":667,"props":907,"children":909},{"id":908},"datatemplate-always-needs-its-own-xdatatype",[910],{"type":49,"value":911},"DataTemplate always needs its own x:DataType",{"type":43,"tag":753,"props":913,"children":915},{"className":755,"code":914,"language":757,"meta":758,"style":758},"\u003CCollectionView ItemsSource=\"{Binding People}\">\n    \u003CCollectionView.ItemTemplate>\n        \u003CDataTemplate x:DataType=\"model:Person\">\n            \u003CLabel Text=\"{Binding FullName}\" \u002F>\n        \u003C\u002FDataTemplate>\n    \u003C\u002FCollectionView.ItemTemplate>\n\u003C\u002FCollectionView>\n",[916],{"type":43,"tag":75,"props":917,"children":918},{"__ignoreMap":758},[919,927,935,943,951,959,967],{"type":43,"tag":764,"props":920,"children":921},{"class":766,"line":767},[922],{"type":43,"tag":764,"props":923,"children":924},{},[925],{"type":49,"value":926},"\u003CCollectionView ItemsSource=\"{Binding People}\">\n",{"type":43,"tag":764,"props":928,"children":929},{"class":766,"line":776},[930],{"type":43,"tag":764,"props":931,"children":932},{},[933],{"type":49,"value":934},"    \u003CCollectionView.ItemTemplate>\n",{"type":43,"tag":764,"props":936,"children":937},{"class":766,"line":785},[938],{"type":43,"tag":764,"props":939,"children":940},{},[941],{"type":49,"value":942},"        \u003CDataTemplate x:DataType=\"model:Person\">\n",{"type":43,"tag":764,"props":944,"children":945},{"class":766,"line":794},[946],{"type":43,"tag":764,"props":947,"children":948},{},[949],{"type":49,"value":950},"            \u003CLabel Text=\"{Binding FullName}\" \u002F>\n",{"type":43,"tag":764,"props":952,"children":953},{"class":766,"line":803},[954],{"type":43,"tag":764,"props":955,"children":956},{},[957],{"type":49,"value":958},"        \u003C\u002FDataTemplate>\n",{"type":43,"tag":764,"props":960,"children":961},{"class":766,"line":812},[962],{"type":43,"tag":764,"props":963,"children":964},{},[965],{"type":49,"value":966},"    \u003C\u002FCollectionView.ItemTemplate>\n",{"type":43,"tag":764,"props":968,"children":969},{"class":766,"line":821},[970],{"type":43,"tag":764,"props":971,"children":972},{},[973],{"type":49,"value":974},"\u003C\u002FCollectionView>\n",{"type":43,"tag":667,"props":976,"children":978},{"id":977},"enforce-binding-warnings-as-errors",[979],{"type":49,"value":980},"Enforce binding warnings as errors",{"type":43,"tag":329,"props":982,"children":983},{},[984,1000],{"type":43,"tag":333,"props":985,"children":986},{},[987],{"type":43,"tag":337,"props":988,"children":989},{},[990,995],{"type":43,"tag":341,"props":991,"children":992},{},[993],{"type":49,"value":994},"Warning",{"type":43,"tag":341,"props":996,"children":997},{},[998],{"type":49,"value":999},"Meaning",{"type":43,"tag":357,"props":1001,"children":1002},{},[1003,1033,1067,1107],{"type":43,"tag":337,"props":1004,"children":1005},{},[1006,1014],{"type":43,"tag":364,"props":1007,"children":1008},{},[1009],{"type":43,"tag":227,"props":1010,"children":1011},{},[1012],{"type":49,"value":1013},"XC0022",{"type":43,"tag":364,"props":1015,"children":1016},{},[1017,1019,1031],{"type":49,"value":1018},"Binding used ",{"type":43,"tag":227,"props":1020,"children":1021},{},[1022,1024,1029],{"type":49,"value":1023},"without ",{"type":43,"tag":75,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":49,"value":80},{"type":49,"value":1030}," in scope",{"type":49,"value":1032}," — not compiled, falls back to reflection",{"type":43,"tag":337,"props":1034,"children":1035},{},[1036,1044],{"type":43,"tag":364,"props":1037,"children":1038},{},[1039],{"type":43,"tag":227,"props":1040,"children":1041},{},[1042],{"type":49,"value":1043},"XC0023",{"type":43,"tag":364,"props":1045,"children":1046},{},[1047,1049,1054,1056],{"type":49,"value":1048},"Binding not compiled because ",{"type":43,"tag":75,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":49,"value":80},{"type":49,"value":1055}," is ",{"type":43,"tag":227,"props":1057,"children":1058},{},[1059,1061],{"type":49,"value":1060},"explicitly ",{"type":43,"tag":75,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":49,"value":1066},"null",{"type":43,"tag":337,"props":1068,"children":1069},{},[1070,1078],{"type":43,"tag":364,"props":1071,"children":1072},{},[1073],{"type":43,"tag":227,"props":1074,"children":1075},{},[1076],{"type":49,"value":1077},"XC0024",{"type":43,"tag":364,"props":1079,"children":1080},{},[1081,1086,1088,1093,1095,1100,1102],{"type":43,"tag":75,"props":1082,"children":1084},{"className":1083},[],[1085],{"type":49,"value":80},{"type":49,"value":1087}," came from an ",{"type":43,"tag":227,"props":1089,"children":1090},{},[1091],{"type":49,"value":1092},"outer scope",{"type":49,"value":1094}," — annotate the ",{"type":43,"tag":75,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":49,"value":393},{"type":49,"value":1101}," with its own ",{"type":43,"tag":75,"props":1103,"children":1105},{"className":1104},[],[1106],{"type":49,"value":80},{"type":43,"tag":337,"props":1108,"children":1109},{},[1110,1117],{"type":43,"tag":364,"props":1111,"children":1112},{},[1113],{"type":43,"tag":227,"props":1114,"children":1115},{},[1116],{"type":49,"value":602},{"type":43,"tag":364,"props":1118,"children":1119},{},[1120,1122,1131,1133],{"type":49,"value":1121},"Binding not compiled because it has an explicit ",{"type":43,"tag":227,"props":1123,"children":1124},{},[1125],{"type":43,"tag":75,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":49,"value":1130},"Source",{"type":49,"value":1132}," — enable ",{"type":43,"tag":75,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":49,"value":1138},"\u003CMauiEnableXamlCBindingWithSourceCompilation>",{"type":43,"tag":1140,"props":1141,"children":1142},"blockquote",{},[1143],{"type":43,"tag":52,"props":1144,"children":1145},{},[1146,1148,1153,1155,1161,1162,1168,1170,1176],{"type":49,"value":1147},"These four codes are ",{"type":43,"tag":227,"props":1149,"children":1150},{},[1151],{"type":49,"value":1152},"verified against .NET 10 \u002F .NET 11 MAUI",{"type":49,"value":1154},"\n(",{"type":43,"tag":75,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":49,"value":1160},"Build.Tasks\u002FBuildException.cs",{"type":49,"value":159},{"type":43,"tag":75,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":49,"value":1167},"ErrorMessages.resx",{"type":49,"value":1169},"). Diagnostic numbering is\nSDK-band-sensitive — re-check against ",{"type":43,"tag":75,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":49,"value":1175},"BuildException.cs",{"type":49,"value":1177}," before relying on it on a\nnewer SDK.",{"type":43,"tag":52,"props":1179,"children":1180},{},[1181,1183,1189],{"type":49,"value":1182},"Add to the ",{"type":43,"tag":75,"props":1184,"children":1186},{"className":1185},[],[1187],{"type":49,"value":1188},".csproj",{"type":49,"value":696},{"type":43,"tag":753,"props":1191,"children":1193},{"className":755,"code":1192,"language":757,"meta":758,"style":758},"\u003C!-- Compile bindings that use Source= as well; otherwise XC0025 fires on every\n     Source= \u002F RelativeSource binding. As of .NET 10\u002F11 this is on by default\n     only for AOT \u002F full-trim builds. -->\n\u003CMauiEnableXamlCBindingWithSourceCompilation>true\u003C\u002FMauiEnableXamlCBindingWithSourceCompilation>\n\u003CWarningsAsErrors>XC0022;XC0025\u003C\u002FWarningsAsErrors>\n",[1194],{"type":43,"tag":75,"props":1195,"children":1196},{"__ignoreMap":758},[1197,1205,1213,1221,1229],{"type":43,"tag":764,"props":1198,"children":1199},{"class":766,"line":767},[1200],{"type":43,"tag":764,"props":1201,"children":1202},{},[1203],{"type":49,"value":1204},"\u003C!-- Compile bindings that use Source= as well; otherwise XC0025 fires on every\n",{"type":43,"tag":764,"props":1206,"children":1207},{"class":766,"line":776},[1208],{"type":43,"tag":764,"props":1209,"children":1210},{},[1211],{"type":49,"value":1212},"     Source= \u002F RelativeSource binding. As of .NET 10\u002F11 this is on by default\n",{"type":43,"tag":764,"props":1214,"children":1215},{"class":766,"line":785},[1216],{"type":43,"tag":764,"props":1217,"children":1218},{},[1219],{"type":49,"value":1220},"     only for AOT \u002F full-trim builds. -->\n",{"type":43,"tag":764,"props":1222,"children":1223},{"class":766,"line":794},[1224],{"type":43,"tag":764,"props":1225,"children":1226},{},[1227],{"type":49,"value":1228},"\u003CMauiEnableXamlCBindingWithSourceCompilation>true\u003C\u002FMauiEnableXamlCBindingWithSourceCompilation>\n",{"type":43,"tag":764,"props":1230,"children":1231},{"class":766,"line":803},[1232],{"type":43,"tag":764,"props":1233,"children":1234},{},[1235],{"type":49,"value":1236},"\u003CWarningsAsErrors>XC0022;XC0025\u003C\u002FWarningsAsErrors>\n",{"type":43,"tag":52,"props":1238,"children":1239},{},[1240,1242,1247,1249,1254,1255,1260],{"type":49,"value":1241},"If you promote ",{"type":43,"tag":75,"props":1243,"children":1245},{"className":1244},[],[1246],{"type":49,"value":602},{"type":49,"value":1248}," without enabling that switch, make sure the project has no\n",{"type":43,"tag":75,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":49,"value":610},{"type":49,"value":114},{"type":43,"tag":75,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":49,"value":617},{"type":49,"value":1261}," bindings — otherwise they will be reported.",{"type":43,"tag":638,"props":1263,"children":1264},{},[],{"type":43,"tag":58,"props":1266,"children":1268},{"id":1267},"binding-modes",[1269],{"type":49,"value":1270},"Binding Modes",{"type":43,"tag":52,"props":1272,"children":1273},{},[1274,1275,1281,1283,1288],{"type":49,"value":564},{"type":43,"tag":75,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":49,"value":1280},"Mode",{"type":49,"value":1282}," explicitly ",{"type":43,"tag":227,"props":1284,"children":1285},{},[1286],{"type":49,"value":1287},"only",{"type":49,"value":1289}," when overriding the default. Most properties\nalready have the correct default:",{"type":43,"tag":329,"props":1291,"children":1292},{},[1293,1313],{"type":43,"tag":333,"props":1294,"children":1295},{},[1296],{"type":43,"tag":337,"props":1297,"children":1298},{},[1299,1303,1308],{"type":43,"tag":341,"props":1300,"children":1301},{},[1302],{"type":49,"value":1280},{"type":43,"tag":341,"props":1304,"children":1305},{},[1306],{"type":49,"value":1307},"Direction",{"type":43,"tag":341,"props":1309,"children":1310},{},[1311],{"type":49,"value":1312},"Use case",{"type":43,"tag":357,"props":1314,"children":1315},{},[1316,1338,1374,1396],{"type":43,"tag":337,"props":1317,"children":1318},{},[1319,1328,1333],{"type":43,"tag":364,"props":1320,"children":1321},{},[1322],{"type":43,"tag":75,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":49,"value":1327},"OneWay",{"type":43,"tag":364,"props":1329,"children":1330},{},[1331],{"type":49,"value":1332},"Source → Target",{"type":43,"tag":364,"props":1334,"children":1335},{},[1336],{"type":49,"value":1337},"Display-only (default for most properties)",{"type":43,"tag":337,"props":1339,"children":1340},{},[1341,1350,1355],{"type":43,"tag":364,"props":1342,"children":1343},{},[1344],{"type":43,"tag":75,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":49,"value":1349},"TwoWay",{"type":43,"tag":364,"props":1351,"children":1352},{},[1353],{"type":49,"value":1354},"Source ↔ Target",{"type":43,"tag":364,"props":1356,"children":1357},{},[1358,1360,1366,1367,1373],{"type":49,"value":1359},"Editable controls (",{"type":43,"tag":75,"props":1361,"children":1363},{"className":1362},[],[1364],{"type":49,"value":1365},"Entry.Text",{"type":49,"value":159},{"type":43,"tag":75,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":49,"value":1372},"Switch.IsToggled",{"type":49,"value":174},{"type":43,"tag":337,"props":1375,"children":1376},{},[1377,1386,1391],{"type":43,"tag":364,"props":1378,"children":1379},{},[1380],{"type":43,"tag":75,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":49,"value":1385},"OneWayToSource",{"type":43,"tag":364,"props":1387,"children":1388},{},[1389],{"type":49,"value":1390},"Target → Source",{"type":43,"tag":364,"props":1392,"children":1393},{},[1394],{"type":49,"value":1395},"Read user input without pushing back to UI",{"type":43,"tag":337,"props":1397,"children":1398},{},[1399,1408,1413],{"type":43,"tag":364,"props":1400,"children":1401},{},[1402],{"type":43,"tag":75,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":49,"value":1407},"OneTime",{"type":43,"tag":364,"props":1409,"children":1410},{},[1411],{"type":49,"value":1412},"Source → Target (once)",{"type":43,"tag":364,"props":1414,"children":1415},{},[1416],{"type":49,"value":1417},"Static values; no change-tracking overhead",{"type":43,"tag":753,"props":1419,"children":1421},{"className":755,"code":1420,"language":757,"meta":758,"style":758},"\u003C!-- ✅ Defaults — omit Mode -->\n\u003CLabel Text=\"{Binding Score}\" \u002F>\n\u003CEntry Text=\"{Binding UserName}\" \u002F>\n\u003CSwitch IsToggled=\"{Binding DarkMode}\" \u002F>\n\n\u003C!-- ✅ Override only when needed -->\n\u003CLabel Text=\"{Binding Title, Mode=OneTime}\" \u002F>\n\u003CEntry Text=\"{Binding SearchQuery, Mode=OneWayToSource}\" \u002F>\n\n\u003C!-- ❌ Redundant — adds noise -->\n\u003CLabel Text=\"{Binding Score, Mode=OneWay}\" \u002F>\n\u003CEntry Text=\"{Binding UserName, Mode=TwoWay}\" \u002F>\n",[1422],{"type":43,"tag":75,"props":1423,"children":1424},{"__ignoreMap":758},[1425,1433,1441,1449,1457,1464,1472,1480,1488,1495,1503,1511],{"type":43,"tag":764,"props":1426,"children":1427},{"class":766,"line":767},[1428],{"type":43,"tag":764,"props":1429,"children":1430},{},[1431],{"type":49,"value":1432},"\u003C!-- ✅ Defaults — omit Mode -->\n",{"type":43,"tag":764,"props":1434,"children":1435},{"class":766,"line":776},[1436],{"type":43,"tag":764,"props":1437,"children":1438},{},[1439],{"type":49,"value":1440},"\u003CLabel Text=\"{Binding Score}\" \u002F>\n",{"type":43,"tag":764,"props":1442,"children":1443},{"class":766,"line":785},[1444],{"type":43,"tag":764,"props":1445,"children":1446},{},[1447],{"type":49,"value":1448},"\u003CEntry Text=\"{Binding UserName}\" \u002F>\n",{"type":43,"tag":764,"props":1450,"children":1451},{"class":766,"line":794},[1452],{"type":43,"tag":764,"props":1453,"children":1454},{},[1455],{"type":49,"value":1456},"\u003CSwitch IsToggled=\"{Binding DarkMode}\" \u002F>\n",{"type":43,"tag":764,"props":1458,"children":1459},{"class":766,"line":803},[1460],{"type":43,"tag":764,"props":1461,"children":1462},{"emptyLinePlaceholder":843},[1463],{"type":49,"value":846},{"type":43,"tag":764,"props":1465,"children":1466},{"class":766,"line":812},[1467],{"type":43,"tag":764,"props":1468,"children":1469},{},[1470],{"type":49,"value":1471},"\u003C!-- ✅ Override only when needed -->\n",{"type":43,"tag":764,"props":1473,"children":1474},{"class":766,"line":821},[1475],{"type":43,"tag":764,"props":1476,"children":1477},{},[1478],{"type":49,"value":1479},"\u003CLabel Text=\"{Binding Title, Mode=OneTime}\" \u002F>\n",{"type":43,"tag":764,"props":1481,"children":1482},{"class":766,"line":830},[1483],{"type":43,"tag":764,"props":1484,"children":1485},{},[1486],{"type":49,"value":1487},"\u003CEntry Text=\"{Binding SearchQuery, Mode=OneWayToSource}\" \u002F>\n",{"type":43,"tag":764,"props":1489,"children":1490},{"class":766,"line":839},[1491],{"type":43,"tag":764,"props":1492,"children":1493},{"emptyLinePlaceholder":843},[1494],{"type":49,"value":846},{"type":43,"tag":764,"props":1496,"children":1497},{"class":766,"line":849},[1498],{"type":43,"tag":764,"props":1499,"children":1500},{},[1501],{"type":49,"value":1502},"\u003C!-- ❌ Redundant — adds noise -->\n",{"type":43,"tag":764,"props":1504,"children":1505},{"class":766,"line":858},[1506],{"type":43,"tag":764,"props":1507,"children":1508},{},[1509],{"type":49,"value":1510},"\u003CLabel Text=\"{Binding Score, Mode=OneWay}\" \u002F>\n",{"type":43,"tag":764,"props":1512,"children":1513},{"class":766,"line":867},[1514],{"type":43,"tag":764,"props":1515,"children":1516},{},[1517],{"type":49,"value":1518},"\u003CEntry Text=\"{Binding UserName, Mode=TwoWay}\" \u002F>\n",{"type":43,"tag":638,"props":1520,"children":1521},{},[],{"type":43,"tag":58,"props":1523,"children":1525},{"id":1524},"bindingcontext-and-property-paths",[1526],{"type":49,"value":1527},"BindingContext and Property Paths",{"type":43,"tag":52,"props":1529,"children":1530},{},[1531,1533,1539,1540,1545],{"type":49,"value":1532},"Every ",{"type":43,"tag":75,"props":1534,"children":1536},{"className":1535},[],[1537],{"type":49,"value":1538},"BindableObject",{"type":49,"value":455},{"type":43,"tag":75,"props":1541,"children":1543},{"className":1542},[],[1544],{"type":49,"value":144},{"type":49,"value":1546}," from its parent unless\nexplicitly set. Property paths support dot notation and indexers:",{"type":43,"tag":753,"props":1548,"children":1550},{"className":755,"code":1549,"language":757,"meta":758,"style":758},"\u003CLabel Text=\"{Binding Address.City}\" \u002F>\n\u003CLabel Text=\"{Binding Items[0].Name}\" \u002F>\n",[1551],{"type":43,"tag":75,"props":1552,"children":1553},{"__ignoreMap":758},[1554,1562],{"type":43,"tag":764,"props":1555,"children":1556},{"class":766,"line":767},[1557],{"type":43,"tag":764,"props":1558,"children":1559},{},[1560],{"type":49,"value":1561},"\u003CLabel Text=\"{Binding Address.City}\" \u002F>\n",{"type":43,"tag":764,"props":1563,"children":1564},{"class":766,"line":776},[1565],{"type":43,"tag":764,"props":1566,"children":1567},{},[1568],{"type":49,"value":1569},"\u003CLabel Text=\"{Binding Items[0].Name}\" \u002F>\n",{"type":43,"tag":52,"props":1571,"children":1572},{},[1573,1574,1579],{"type":49,"value":564},{"type":43,"tag":75,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":49,"value":144},{"type":49,"value":1580}," in XAML:",{"type":43,"tag":753,"props":1582,"children":1584},{"className":755,"code":1583,"language":757,"meta":758,"style":758},"\u003CContentPage xmlns:vm=\"clr-namespace:MyApp.ViewModels\"\n             x:DataType=\"vm:MainViewModel\">\n    \u003CContentPage.BindingContext>\n        \u003Cvm:MainViewModel \u002F>\n    \u003C\u002FContentPage.BindingContext>\n\u003C\u002FContentPage>\n",[1585],{"type":43,"tag":75,"props":1586,"children":1587},{"__ignoreMap":758},[1588,1595,1602,1610,1618,1626],{"type":43,"tag":764,"props":1589,"children":1590},{"class":766,"line":767},[1591],{"type":43,"tag":764,"props":1592,"children":1593},{},[1594],{"type":49,"value":782},{"type":43,"tag":764,"props":1596,"children":1597},{"class":766,"line":776},[1598],{"type":43,"tag":764,"props":1599,"children":1600},{},[1601],{"type":49,"value":791},{"type":43,"tag":764,"props":1603,"children":1604},{"class":766,"line":785},[1605],{"type":43,"tag":764,"props":1606,"children":1607},{},[1608],{"type":49,"value":1609},"    \u003CContentPage.BindingContext>\n",{"type":43,"tag":764,"props":1611,"children":1612},{"class":766,"line":794},[1613],{"type":43,"tag":764,"props":1614,"children":1615},{},[1616],{"type":49,"value":1617},"        \u003Cvm:MainViewModel \u002F>\n",{"type":43,"tag":764,"props":1619,"children":1620},{"class":766,"line":803},[1621],{"type":43,"tag":764,"props":1622,"children":1623},{},[1624],{"type":49,"value":1625},"    \u003C\u002FContentPage.BindingContext>\n",{"type":43,"tag":764,"props":1627,"children":1628},{"class":766,"line":812},[1629],{"type":43,"tag":764,"props":1630,"children":1631},{},[1632],{"type":49,"value":836},{"type":43,"tag":52,"props":1634,"children":1635},{},[1636],{"type":49,"value":1637},"Or in code-behind (preferred with DI):",{"type":43,"tag":753,"props":1639,"children":1642},{"className":1640,"code":1641,"language":14,"meta":758,"style":758},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","public MainPage(MainViewModel vm)\n{\n    InitializeComponent();\n    BindingContext = vm;\n}\n",[1643],{"type":43,"tag":75,"props":1644,"children":1645},{"__ignoreMap":758},[1646,1654,1662,1670,1678],{"type":43,"tag":764,"props":1647,"children":1648},{"class":766,"line":767},[1649],{"type":43,"tag":764,"props":1650,"children":1651},{},[1652],{"type":49,"value":1653},"public MainPage(MainViewModel vm)\n",{"type":43,"tag":764,"props":1655,"children":1656},{"class":766,"line":776},[1657],{"type":43,"tag":764,"props":1658,"children":1659},{},[1660],{"type":49,"value":1661},"{\n",{"type":43,"tag":764,"props":1663,"children":1664},{"class":766,"line":785},[1665],{"type":43,"tag":764,"props":1666,"children":1667},{},[1668],{"type":49,"value":1669},"    InitializeComponent();\n",{"type":43,"tag":764,"props":1671,"children":1672},{"class":766,"line":794},[1673],{"type":43,"tag":764,"props":1674,"children":1675},{},[1676],{"type":49,"value":1677},"    BindingContext = vm;\n",{"type":43,"tag":764,"props":1679,"children":1680},{"class":766,"line":803},[1681],{"type":43,"tag":764,"props":1682,"children":1683},{},[1684],{"type":49,"value":1685},"}\n",{"type":43,"tag":638,"props":1687,"children":1688},{},[],{"type":43,"tag":58,"props":1690,"children":1692},{"id":1691},"inotifypropertychanged-and-observableobject",[1693],{"type":49,"value":1694},"INotifyPropertyChanged and ObservableObject",{"type":43,"tag":667,"props":1696,"children":1698},{"id":1697},"manual-implementation",[1699],{"type":49,"value":1700},"Manual implementation",{"type":43,"tag":753,"props":1702,"children":1704},{"className":1640,"code":1703,"language":14,"meta":758,"style":758},"public class MainViewModel : INotifyPropertyChanged\n{\n    public event PropertyChangedEventHandler? PropertyChanged;\n\n    private string _title = string.Empty;\n    public string Title\n    {\n        get => _title;\n        set\n        {\n            if (_title != value)\n            {\n                _title = value;\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));\n            }\n        }\n    }\n}\n",[1705],{"type":43,"tag":75,"props":1706,"children":1707},{"__ignoreMap":758},[1708,1716,1723,1731,1738,1746,1754,1762,1770,1778,1786,1794,1802,1810,1818,1826,1834,1843],{"type":43,"tag":764,"props":1709,"children":1710},{"class":766,"line":767},[1711],{"type":43,"tag":764,"props":1712,"children":1713},{},[1714],{"type":49,"value":1715},"public class MainViewModel : INotifyPropertyChanged\n",{"type":43,"tag":764,"props":1717,"children":1718},{"class":766,"line":776},[1719],{"type":43,"tag":764,"props":1720,"children":1721},{},[1722],{"type":49,"value":1661},{"type":43,"tag":764,"props":1724,"children":1725},{"class":766,"line":785},[1726],{"type":43,"tag":764,"props":1727,"children":1728},{},[1729],{"type":49,"value":1730},"    public event PropertyChangedEventHandler? PropertyChanged;\n",{"type":43,"tag":764,"props":1732,"children":1733},{"class":766,"line":794},[1734],{"type":43,"tag":764,"props":1735,"children":1736},{"emptyLinePlaceholder":843},[1737],{"type":49,"value":846},{"type":43,"tag":764,"props":1739,"children":1740},{"class":766,"line":803},[1741],{"type":43,"tag":764,"props":1742,"children":1743},{},[1744],{"type":49,"value":1745},"    private string _title = string.Empty;\n",{"type":43,"tag":764,"props":1747,"children":1748},{"class":766,"line":812},[1749],{"type":43,"tag":764,"props":1750,"children":1751},{},[1752],{"type":49,"value":1753},"    public string Title\n",{"type":43,"tag":764,"props":1755,"children":1756},{"class":766,"line":821},[1757],{"type":43,"tag":764,"props":1758,"children":1759},{},[1760],{"type":49,"value":1761},"    {\n",{"type":43,"tag":764,"props":1763,"children":1764},{"class":766,"line":830},[1765],{"type":43,"tag":764,"props":1766,"children":1767},{},[1768],{"type":49,"value":1769},"        get => _title;\n",{"type":43,"tag":764,"props":1771,"children":1772},{"class":766,"line":839},[1773],{"type":43,"tag":764,"props":1774,"children":1775},{},[1776],{"type":49,"value":1777},"        set\n",{"type":43,"tag":764,"props":1779,"children":1780},{"class":766,"line":849},[1781],{"type":43,"tag":764,"props":1782,"children":1783},{},[1784],{"type":49,"value":1785},"        {\n",{"type":43,"tag":764,"props":1787,"children":1788},{"class":766,"line":858},[1789],{"type":43,"tag":764,"props":1790,"children":1791},{},[1792],{"type":49,"value":1793},"            if (_title != value)\n",{"type":43,"tag":764,"props":1795,"children":1796},{"class":766,"line":867},[1797],{"type":43,"tag":764,"props":1798,"children":1799},{},[1800],{"type":49,"value":1801},"            {\n",{"type":43,"tag":764,"props":1803,"children":1804},{"class":766,"line":875},[1805],{"type":43,"tag":764,"props":1806,"children":1807},{},[1808],{"type":49,"value":1809},"                _title = value;\n",{"type":43,"tag":764,"props":1811,"children":1812},{"class":766,"line":883},[1813],{"type":43,"tag":764,"props":1814,"children":1815},{},[1816],{"type":49,"value":1817},"                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Title)));\n",{"type":43,"tag":764,"props":1819,"children":1820},{"class":766,"line":892},[1821],{"type":43,"tag":764,"props":1822,"children":1823},{},[1824],{"type":49,"value":1825},"            }\n",{"type":43,"tag":764,"props":1827,"children":1828},{"class":766,"line":900},[1829],{"type":43,"tag":764,"props":1830,"children":1831},{},[1832],{"type":49,"value":1833},"        }\n",{"type":43,"tag":764,"props":1835,"children":1837},{"class":766,"line":1836},17,[1838],{"type":43,"tag":764,"props":1839,"children":1840},{},[1841],{"type":49,"value":1842},"    }\n",{"type":43,"tag":764,"props":1844,"children":1846},{"class":766,"line":1845},18,[1847],{"type":43,"tag":764,"props":1848,"children":1849},{},[1850],{"type":49,"value":1685},{"type":43,"tag":667,"props":1852,"children":1854},{"id":1853},"communitytoolkitmvvm-recommended",[1855],{"type":49,"value":1856},"CommunityToolkit.Mvvm (recommended)",{"type":43,"tag":753,"props":1858,"children":1860},{"className":1640,"code":1859,"language":14,"meta":758,"style":758},"using CommunityToolkit.Mvvm.ComponentModel;\nusing CommunityToolkit.Mvvm.Input;\n\npublic partial class MainViewModel : ObservableObject\n{\n    [ObservableProperty]\n    private string _title = string.Empty;\n\n    [RelayCommand]\n    private async Task LoadDataAsync() { \u002F* ... *\u002F }\n}\n",[1861],{"type":43,"tag":75,"props":1862,"children":1863},{"__ignoreMap":758},[1864,1872,1880,1887,1895,1902,1910,1917,1924,1932,1940],{"type":43,"tag":764,"props":1865,"children":1866},{"class":766,"line":767},[1867],{"type":43,"tag":764,"props":1868,"children":1869},{},[1870],{"type":49,"value":1871},"using CommunityToolkit.Mvvm.ComponentModel;\n",{"type":43,"tag":764,"props":1873,"children":1874},{"class":766,"line":776},[1875],{"type":43,"tag":764,"props":1876,"children":1877},{},[1878],{"type":49,"value":1879},"using CommunityToolkit.Mvvm.Input;\n",{"type":43,"tag":764,"props":1881,"children":1882},{"class":766,"line":785},[1883],{"type":43,"tag":764,"props":1884,"children":1885},{"emptyLinePlaceholder":843},[1886],{"type":49,"value":846},{"type":43,"tag":764,"props":1888,"children":1889},{"class":766,"line":794},[1890],{"type":43,"tag":764,"props":1891,"children":1892},{},[1893],{"type":49,"value":1894},"public partial class MainViewModel : ObservableObject\n",{"type":43,"tag":764,"props":1896,"children":1897},{"class":766,"line":803},[1898],{"type":43,"tag":764,"props":1899,"children":1900},{},[1901],{"type":49,"value":1661},{"type":43,"tag":764,"props":1903,"children":1904},{"class":766,"line":812},[1905],{"type":43,"tag":764,"props":1906,"children":1907},{},[1908],{"type":49,"value":1909},"    [ObservableProperty]\n",{"type":43,"tag":764,"props":1911,"children":1912},{"class":766,"line":821},[1913],{"type":43,"tag":764,"props":1914,"children":1915},{},[1916],{"type":49,"value":1745},{"type":43,"tag":764,"props":1918,"children":1919},{"class":766,"line":830},[1920],{"type":43,"tag":764,"props":1921,"children":1922},{"emptyLinePlaceholder":843},[1923],{"type":49,"value":846},{"type":43,"tag":764,"props":1925,"children":1926},{"class":766,"line":839},[1927],{"type":43,"tag":764,"props":1928,"children":1929},{},[1930],{"type":49,"value":1931},"    [RelayCommand]\n",{"type":43,"tag":764,"props":1933,"children":1934},{"class":766,"line":849},[1935],{"type":43,"tag":764,"props":1936,"children":1937},{},[1938],{"type":49,"value":1939},"    private async Task LoadDataAsync() { \u002F* ... *\u002F }\n",{"type":43,"tag":764,"props":1941,"children":1942},{"class":766,"line":858},[1943],{"type":43,"tag":764,"props":1944,"children":1945},{},[1946],{"type":49,"value":1685},{"type":43,"tag":52,"props":1948,"children":1949},{},[1950,1952,1958,1960,1966,1968,1974],{"type":49,"value":1951},"The source generator creates the ",{"type":43,"tag":75,"props":1953,"children":1955},{"className":1954},[],[1956],{"type":49,"value":1957},"Title",{"type":49,"value":1959}," property, ",{"type":43,"tag":75,"props":1961,"children":1963},{"className":1962},[],[1964],{"type":49,"value":1965},"PropertyChanged",{"type":49,"value":1967}," raise,\nand ",{"type":43,"tag":75,"props":1969,"children":1971},{"className":1970},[],[1972],{"type":49,"value":1973},"LoadDataCommand",{"type":49,"value":1975}," automatically.",{"type":43,"tag":638,"props":1977,"children":1978},{},[],{"type":43,"tag":58,"props":1980,"children":1982},{"id":1981},"value-converters-ivalueconverter",[1983],{"type":49,"value":1984},"Value Converters — IValueConverter",{"type":43,"tag":52,"props":1986,"children":1987},{},[1988,1990,1996,1998,2004],{"type":49,"value":1989},"Implement ",{"type":43,"tag":75,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":49,"value":1995},"Convert",{"type":49,"value":1997}," (source → target) and ",{"type":43,"tag":75,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":49,"value":2003},"ConvertBack",{"type":49,"value":2005}," (target → source):",{"type":43,"tag":753,"props":2007,"children":2009},{"className":1640,"code":2008,"language":14,"meta":758,"style":758},"public class IntToBoolConverter : IValueConverter\n{\n    public object? Convert(object? value, Type targetType,\n        object? parameter, CultureInfo culture)\n        => value is int i && i != 0;\n\n    public object? ConvertBack(object? value, Type targetType,\n        object? parameter, CultureInfo culture)\n        => value is true ? 1 : 0;\n}\n",[2010],{"type":43,"tag":75,"props":2011,"children":2012},{"__ignoreMap":758},[2013,2021,2028,2036,2044,2052,2059,2067,2074,2082],{"type":43,"tag":764,"props":2014,"children":2015},{"class":766,"line":767},[2016],{"type":43,"tag":764,"props":2017,"children":2018},{},[2019],{"type":49,"value":2020},"public class IntToBoolConverter : IValueConverter\n",{"type":43,"tag":764,"props":2022,"children":2023},{"class":766,"line":776},[2024],{"type":43,"tag":764,"props":2025,"children":2026},{},[2027],{"type":49,"value":1661},{"type":43,"tag":764,"props":2029,"children":2030},{"class":766,"line":785},[2031],{"type":43,"tag":764,"props":2032,"children":2033},{},[2034],{"type":49,"value":2035},"    public object? Convert(object? value, Type targetType,\n",{"type":43,"tag":764,"props":2037,"children":2038},{"class":766,"line":794},[2039],{"type":43,"tag":764,"props":2040,"children":2041},{},[2042],{"type":49,"value":2043},"        object? parameter, CultureInfo culture)\n",{"type":43,"tag":764,"props":2045,"children":2046},{"class":766,"line":803},[2047],{"type":43,"tag":764,"props":2048,"children":2049},{},[2050],{"type":49,"value":2051},"        => value is int i && i != 0;\n",{"type":43,"tag":764,"props":2053,"children":2054},{"class":766,"line":812},[2055],{"type":43,"tag":764,"props":2056,"children":2057},{"emptyLinePlaceholder":843},[2058],{"type":49,"value":846},{"type":43,"tag":764,"props":2060,"children":2061},{"class":766,"line":821},[2062],{"type":43,"tag":764,"props":2063,"children":2064},{},[2065],{"type":49,"value":2066},"    public object? ConvertBack(object? value, Type targetType,\n",{"type":43,"tag":764,"props":2068,"children":2069},{"class":766,"line":830},[2070],{"type":43,"tag":764,"props":2071,"children":2072},{},[2073],{"type":49,"value":2043},{"type":43,"tag":764,"props":2075,"children":2076},{"class":766,"line":839},[2077],{"type":43,"tag":764,"props":2078,"children":2079},{},[2080],{"type":49,"value":2081},"        => value is true ? 1 : 0;\n",{"type":43,"tag":764,"props":2083,"children":2084},{"class":766,"line":849},[2085],{"type":43,"tag":764,"props":2086,"children":2087},{},[2088],{"type":49,"value":1685},{"type":43,"tag":52,"props":2090,"children":2091},{},[2092],{"type":49,"value":2093},"Declare in XAML resources and consume:",{"type":43,"tag":753,"props":2095,"children":2097},{"className":755,"code":2096,"language":757,"meta":758,"style":758},"\u003CContentPage.Resources>\n    \u003Clocal:IntToBoolConverter x:Key=\"IntToBool\" \u002F>\n\u003C\u002FContentPage.Resources>\n\n\u003CSwitch IsToggled=\"{Binding Count, Converter={StaticResource IntToBool}}\" \u002F>\n",[2098],{"type":43,"tag":75,"props":2099,"children":2100},{"__ignoreMap":758},[2101,2109,2117,2125,2132],{"type":43,"tag":764,"props":2102,"children":2103},{"class":766,"line":767},[2104],{"type":43,"tag":764,"props":2105,"children":2106},{},[2107],{"type":49,"value":2108},"\u003CContentPage.Resources>\n",{"type":43,"tag":764,"props":2110,"children":2111},{"class":766,"line":776},[2112],{"type":43,"tag":764,"props":2113,"children":2114},{},[2115],{"type":49,"value":2116},"    \u003Clocal:IntToBoolConverter x:Key=\"IntToBool\" \u002F>\n",{"type":43,"tag":764,"props":2118,"children":2119},{"class":766,"line":785},[2120],{"type":43,"tag":764,"props":2121,"children":2122},{},[2123],{"type":49,"value":2124},"\u003C\u002FContentPage.Resources>\n",{"type":43,"tag":764,"props":2126,"children":2127},{"class":766,"line":794},[2128],{"type":43,"tag":764,"props":2129,"children":2130},{"emptyLinePlaceholder":843},[2131],{"type":49,"value":846},{"type":43,"tag":764,"props":2133,"children":2134},{"class":766,"line":803},[2135],{"type":43,"tag":764,"props":2136,"children":2137},{},[2138],{"type":49,"value":2139},"\u003CSwitch IsToggled=\"{Binding Count, Converter={StaticResource IntToBool}}\" \u002F>\n",{"type":43,"tag":52,"props":2141,"children":2142},{},[2143,2149,2151,2156,2158,2163],{"type":43,"tag":75,"props":2144,"children":2146},{"className":2145},[],[2147],{"type":49,"value":2148},"ConverterParameter",{"type":49,"value":2150}," is always passed as a ",{"type":43,"tag":227,"props":2152,"children":2153},{},[2154],{"type":49,"value":2155},"string",{"type":49,"value":2157}," — parse inside ",{"type":43,"tag":75,"props":2159,"children":2161},{"className":2160},[],[2162],{"type":49,"value":1995},{"type":49,"value":696},{"type":43,"tag":753,"props":2165,"children":2167},{"className":755,"code":2166,"language":757,"meta":758,"style":758},"\u003CLabel Text=\"{Binding Score, Converter={StaticResource ThresholdConverter},\n              ConverterParameter=50}\" \u002F>\n",[2168],{"type":43,"tag":75,"props":2169,"children":2170},{"__ignoreMap":758},[2171,2179],{"type":43,"tag":764,"props":2172,"children":2173},{"class":766,"line":767},[2174],{"type":43,"tag":764,"props":2175,"children":2176},{},[2177],{"type":49,"value":2178},"\u003CLabel Text=\"{Binding Score, Converter={StaticResource ThresholdConverter},\n",{"type":43,"tag":764,"props":2180,"children":2181},{"class":766,"line":776},[2182],{"type":43,"tag":764,"props":2183,"children":2184},{},[2185],{"type":49,"value":2186},"              ConverterParameter=50}\" \u002F>\n",{"type":43,"tag":638,"props":2188,"children":2189},{},[],{"type":43,"tag":58,"props":2191,"children":2193},{"id":2192},"multi-binding",[2194],{"type":49,"value":2195},"Multi-Binding",{"type":43,"tag":52,"props":2197,"children":2198},{},[2199,2201,2206],{"type":49,"value":2200},"Combine multiple source values with ",{"type":43,"tag":75,"props":2202,"children":2204},{"className":2203},[],[2205],{"type":49,"value":120},{"type":49,"value":696},{"type":43,"tag":753,"props":2208,"children":2210},{"className":755,"code":2209,"language":757,"meta":758,"style":758},"\u003CLabel>\n    \u003CLabel.Text>\n        \u003CMultiBinding Converter=\"{StaticResource FullNameConverter}\">\n            \u003CBinding Path=\"FirstName\" \u002F>\n            \u003CBinding Path=\"LastName\" \u002F>\n        \u003C\u002FMultiBinding>\n    \u003C\u002FLabel.Text>\n\u003C\u002FLabel>\n",[2211],{"type":43,"tag":75,"props":2212,"children":2213},{"__ignoreMap":758},[2214,2222,2230,2238,2246,2254,2262,2270],{"type":43,"tag":764,"props":2215,"children":2216},{"class":766,"line":767},[2217],{"type":43,"tag":764,"props":2218,"children":2219},{},[2220],{"type":49,"value":2221},"\u003CLabel>\n",{"type":43,"tag":764,"props":2223,"children":2224},{"class":766,"line":776},[2225],{"type":43,"tag":764,"props":2226,"children":2227},{},[2228],{"type":49,"value":2229},"    \u003CLabel.Text>\n",{"type":43,"tag":764,"props":2231,"children":2232},{"class":766,"line":785},[2233],{"type":43,"tag":764,"props":2234,"children":2235},{},[2236],{"type":49,"value":2237},"        \u003CMultiBinding Converter=\"{StaticResource FullNameConverter}\">\n",{"type":43,"tag":764,"props":2239,"children":2240},{"class":766,"line":794},[2241],{"type":43,"tag":764,"props":2242,"children":2243},{},[2244],{"type":49,"value":2245},"            \u003CBinding Path=\"FirstName\" \u002F>\n",{"type":43,"tag":764,"props":2247,"children":2248},{"class":766,"line":803},[2249],{"type":43,"tag":764,"props":2250,"children":2251},{},[2252],{"type":49,"value":2253},"            \u003CBinding Path=\"LastName\" \u002F>\n",{"type":43,"tag":764,"props":2255,"children":2256},{"class":766,"line":812},[2257],{"type":43,"tag":764,"props":2258,"children":2259},{},[2260],{"type":49,"value":2261},"        \u003C\u002FMultiBinding>\n",{"type":43,"tag":764,"props":2263,"children":2264},{"class":766,"line":821},[2265],{"type":43,"tag":764,"props":2266,"children":2267},{},[2268],{"type":49,"value":2269},"    \u003C\u002FLabel.Text>\n",{"type":43,"tag":764,"props":2271,"children":2272},{"class":766,"line":830},[2273],{"type":43,"tag":764,"props":2274,"children":2275},{},[2276],{"type":49,"value":2277},"\u003C\u002FLabel>\n",{"type":43,"tag":753,"props":2279,"children":2281},{"className":1640,"code":2280,"language":14,"meta":758,"style":758},"public class FullNameConverter : IMultiValueConverter\n{\n    public object Convert(object[] values, Type targetType,\n        object parameter, CultureInfo culture)\n    {\n        if (values.Length == 2 && values[0] is string first\n            && values[1] is string last)\n            return $\"{first} {last}\";\n        return string.Empty;\n    }\n\n    public object[] ConvertBack(object value, Type[] targetTypes,\n        object parameter, CultureInfo culture)\n        => throw new NotSupportedException();\n}\n",[2282],{"type":43,"tag":75,"props":2283,"children":2284},{"__ignoreMap":758},[2285,2293,2300,2308,2316,2323,2331,2339,2347,2355,2362,2369,2377,2384,2392],{"type":43,"tag":764,"props":2286,"children":2287},{"class":766,"line":767},[2288],{"type":43,"tag":764,"props":2289,"children":2290},{},[2291],{"type":49,"value":2292},"public class FullNameConverter : IMultiValueConverter\n",{"type":43,"tag":764,"props":2294,"children":2295},{"class":766,"line":776},[2296],{"type":43,"tag":764,"props":2297,"children":2298},{},[2299],{"type":49,"value":1661},{"type":43,"tag":764,"props":2301,"children":2302},{"class":766,"line":785},[2303],{"type":43,"tag":764,"props":2304,"children":2305},{},[2306],{"type":49,"value":2307},"    public object Convert(object[] values, Type targetType,\n",{"type":43,"tag":764,"props":2309,"children":2310},{"class":766,"line":794},[2311],{"type":43,"tag":764,"props":2312,"children":2313},{},[2314],{"type":49,"value":2315},"        object parameter, CultureInfo culture)\n",{"type":43,"tag":764,"props":2317,"children":2318},{"class":766,"line":803},[2319],{"type":43,"tag":764,"props":2320,"children":2321},{},[2322],{"type":49,"value":1761},{"type":43,"tag":764,"props":2324,"children":2325},{"class":766,"line":812},[2326],{"type":43,"tag":764,"props":2327,"children":2328},{},[2329],{"type":49,"value":2330},"        if (values.Length == 2 && values[0] is string first\n",{"type":43,"tag":764,"props":2332,"children":2333},{"class":766,"line":821},[2334],{"type":43,"tag":764,"props":2335,"children":2336},{},[2337],{"type":49,"value":2338},"            && values[1] is string last)\n",{"type":43,"tag":764,"props":2340,"children":2341},{"class":766,"line":830},[2342],{"type":43,"tag":764,"props":2343,"children":2344},{},[2345],{"type":49,"value":2346},"            return $\"{first} {last}\";\n",{"type":43,"tag":764,"props":2348,"children":2349},{"class":766,"line":839},[2350],{"type":43,"tag":764,"props":2351,"children":2352},{},[2353],{"type":49,"value":2354},"        return string.Empty;\n",{"type":43,"tag":764,"props":2356,"children":2357},{"class":766,"line":849},[2358],{"type":43,"tag":764,"props":2359,"children":2360},{},[2361],{"type":49,"value":1842},{"type":43,"tag":764,"props":2363,"children":2364},{"class":766,"line":858},[2365],{"type":43,"tag":764,"props":2366,"children":2367},{"emptyLinePlaceholder":843},[2368],{"type":49,"value":846},{"type":43,"tag":764,"props":2370,"children":2371},{"class":766,"line":867},[2372],{"type":43,"tag":764,"props":2373,"children":2374},{},[2375],{"type":49,"value":2376},"    public object[] ConvertBack(object value, Type[] targetTypes,\n",{"type":43,"tag":764,"props":2378,"children":2379},{"class":766,"line":875},[2380],{"type":43,"tag":764,"props":2381,"children":2382},{},[2383],{"type":49,"value":2315},{"type":43,"tag":764,"props":2385,"children":2386},{"class":766,"line":883},[2387],{"type":43,"tag":764,"props":2388,"children":2389},{},[2390],{"type":49,"value":2391},"        => throw new NotSupportedException();\n",{"type":43,"tag":764,"props":2393,"children":2394},{"class":766,"line":892},[2395],{"type":43,"tag":764,"props":2396,"children":2397},{},[2398],{"type":49,"value":1685},{"type":43,"tag":638,"props":2400,"children":2401},{},[],{"type":43,"tag":58,"props":2403,"children":2405},{"id":2404},"relative-bindings",[2406],{"type":49,"value":2407},"Relative Bindings",{"type":43,"tag":329,"props":2409,"children":2410},{},[2411,2430],{"type":43,"tag":333,"props":2412,"children":2413},{},[2414],{"type":43,"tag":337,"props":2415,"children":2416},{},[2417,2421,2426],{"type":43,"tag":341,"props":2418,"children":2419},{},[2420],{"type":49,"value":1130},{"type":43,"tag":341,"props":2422,"children":2423},{},[2424],{"type":49,"value":2425},"Syntax",{"type":43,"tag":341,"props":2427,"children":2428},{},[2429],{"type":49,"value":1312},{"type":43,"tag":357,"props":2431,"children":2432},{},[2433,2454,2476],{"type":43,"tag":337,"props":2434,"children":2435},{},[2436,2440,2449],{"type":43,"tag":364,"props":2437,"children":2438},{},[2439],{"type":49,"value":157},{"type":43,"tag":364,"props":2441,"children":2442},{},[2443],{"type":43,"tag":75,"props":2444,"children":2446},{"className":2445},[],[2447],{"type":49,"value":2448},"{Binding Source={RelativeSource Self}, Path=WidthRequest}",{"type":43,"tag":364,"props":2450,"children":2451},{},[2452],{"type":49,"value":2453},"Bind to own properties",{"type":43,"tag":337,"props":2455,"children":2456},{},[2457,2462,2471],{"type":43,"tag":364,"props":2458,"children":2459},{},[2460],{"type":49,"value":2461},"Ancestor",{"type":43,"tag":364,"props":2463,"children":2464},{},[2465],{"type":43,"tag":75,"props":2466,"children":2468},{"className":2467},[],[2469],{"type":49,"value":2470},"{Binding BindingContext.Title, Source={RelativeSource AncestorType={x:Type ContentPage}}}",{"type":43,"tag":364,"props":2472,"children":2473},{},[2474],{"type":49,"value":2475},"Reach parent BindingContext",{"type":43,"tag":337,"props":2477,"children":2478},{},[2479,2483,2492],{"type":43,"tag":364,"props":2480,"children":2481},{},[2482],{"type":49,"value":172},{"type":43,"tag":364,"props":2484,"children":2485},{},[2486],{"type":43,"tag":75,"props":2487,"children":2489},{"className":2488},[],[2490],{"type":49,"value":2491},"{Binding Source={RelativeSource TemplatedParent}, Path=Padding}",{"type":43,"tag":364,"props":2493,"children":2494},{},[2495],{"type":49,"value":2496},"Inside ControlTemplate",{"type":43,"tag":753,"props":2498,"children":2500},{"className":755,"code":2499,"language":757,"meta":758,"style":758},"\u003C!-- Square box: Height = Width -->\n\u003CBoxView WidthRequest=\"100\"\n         HeightRequest=\"{Binding Source={RelativeSource Self}, Path=WidthRequest}\" \u002F>\n",[2501],{"type":43,"tag":75,"props":2502,"children":2503},{"__ignoreMap":758},[2504,2512,2520],{"type":43,"tag":764,"props":2505,"children":2506},{"class":766,"line":767},[2507],{"type":43,"tag":764,"props":2508,"children":2509},{},[2510],{"type":49,"value":2511},"\u003C!-- Square box: Height = Width -->\n",{"type":43,"tag":764,"props":2513,"children":2514},{"class":766,"line":776},[2515],{"type":43,"tag":764,"props":2516,"children":2517},{},[2518],{"type":49,"value":2519},"\u003CBoxView WidthRequest=\"100\"\n",{"type":43,"tag":764,"props":2521,"children":2522},{"class":766,"line":785},[2523],{"type":43,"tag":764,"props":2524,"children":2525},{},[2526],{"type":49,"value":2527},"         HeightRequest=\"{Binding Source={RelativeSource Self}, Path=WidthRequest}\" \u002F>\n",{"type":43,"tag":638,"props":2529,"children":2530},{},[],{"type":43,"tag":58,"props":2532,"children":2534},{"id":2533},"stringformat",[2535],{"type":49,"value":185},{"type":43,"tag":52,"props":2537,"children":2538},{},[2539,2541,2547],{"type":49,"value":2540},"Use ",{"type":43,"tag":75,"props":2542,"children":2544},{"className":2543},[],[2545],{"type":49,"value":2546},"Binding.StringFormat",{"type":49,"value":2548}," for simple display formatting without a converter:",{"type":43,"tag":753,"props":2550,"children":2552},{"className":755,"code":2551,"language":757,"meta":758,"style":758},"\u003CLabel Text=\"{Binding Price, StringFormat='Total: {0:C2}'}\" \u002F>\n\u003CLabel Text=\"{Binding DueDate, StringFormat='{0:MMM dd, yyyy}'}\" \u002F>\n",[2553],{"type":43,"tag":75,"props":2554,"children":2555},{"__ignoreMap":758},[2556,2564],{"type":43,"tag":764,"props":2557,"children":2558},{"class":766,"line":767},[2559],{"type":43,"tag":764,"props":2560,"children":2561},{},[2562],{"type":49,"value":2563},"\u003CLabel Text=\"{Binding Price, StringFormat='Total: {0:C2}'}\" \u002F>\n",{"type":43,"tag":764,"props":2565,"children":2566},{"class":766,"line":776},[2567],{"type":43,"tag":764,"props":2568,"children":2569},{},[2570],{"type":49,"value":2571},"\u003CLabel Text=\"{Binding DueDate, StringFormat='{0:MMM dd, yyyy}'}\" \u002F>\n",{"type":43,"tag":52,"props":2573,"children":2574},{},[2575],{"type":49,"value":2576},"Wrap the format string in single quotes when it contains commas or braces.",{"type":43,"tag":638,"props":2578,"children":2579},{},[],{"type":43,"tag":58,"props":2581,"children":2583},{"id":2582},"binding-fallbacks",[2584],{"type":49,"value":2585},"Binding Fallbacks",{"type":43,"tag":65,"props":2587,"children":2588},{},[2589,2598],{"type":43,"tag":69,"props":2590,"children":2591},{},[2592,2596],{"type":43,"tag":227,"props":2593,"children":2594},{},[2595],{"type":49,"value":192},{"type":49,"value":2597}," — used when the binding path cannot be resolved or the\nconverter throws.",{"type":43,"tag":69,"props":2599,"children":2600},{},[2601,2605,2607,2612],{"type":43,"tag":227,"props":2602,"children":2603},{},[2604],{"type":49,"value":200},{"type":49,"value":2606}," — used when the bound value is ",{"type":43,"tag":75,"props":2608,"children":2610},{"className":2609},[],[2611],{"type":49,"value":1066},{"type":49,"value":665},{"type":43,"tag":753,"props":2614,"children":2616},{"className":755,"code":2615,"language":757,"meta":758,"style":758},"\u003CLabel Text=\"{Binding MiddleName, TargetNullValue='(none)',\n              FallbackValue='unavailable'}\" \u002F>\n\u003CImage Source=\"{Binding AvatarUrl, TargetNullValue='default_avatar.png'}\" \u002F>\n",[2617],{"type":43,"tag":75,"props":2618,"children":2619},{"__ignoreMap":758},[2620,2628,2636],{"type":43,"tag":764,"props":2621,"children":2622},{"class":766,"line":767},[2623],{"type":43,"tag":764,"props":2624,"children":2625},{},[2626],{"type":49,"value":2627},"\u003CLabel Text=\"{Binding MiddleName, TargetNullValue='(none)',\n",{"type":43,"tag":764,"props":2629,"children":2630},{"class":766,"line":776},[2631],{"type":43,"tag":764,"props":2632,"children":2633},{},[2634],{"type":49,"value":2635},"              FallbackValue='unavailable'}\" \u002F>\n",{"type":43,"tag":764,"props":2637,"children":2638},{"class":766,"line":785},[2639],{"type":43,"tag":764,"props":2640,"children":2641},{},[2642],{"type":49,"value":2643},"\u003CImage Source=\"{Binding AvatarUrl, TargetNullValue='default_avatar.png'}\" \u002F>\n",{"type":43,"tag":638,"props":2645,"children":2646},{},[],{"type":43,"tag":58,"props":2648,"children":2650},{"id":2649},"net-9-code-bindings-aot-safe",[2651],{"type":49,"value":2652},".NET 9+ Code Bindings (AOT-safe)",{"type":43,"tag":52,"props":2654,"children":2655},{},[2656],{"type":49,"value":2657},"Fully AOT-safe, no reflection:",{"type":43,"tag":753,"props":2659,"children":2661},{"className":1640,"code":2660,"language":14,"meta":758,"style":758},"label.SetBinding(Label.TextProperty,\n    static (PersonViewModel vm) => vm.FullName);\n\nentry.SetBinding(Entry.TextProperty,\n    static (PersonViewModel vm) => vm.Age,\n    mode: BindingMode.TwoWay,\n    converter: new IntToStringConverter());\n",[2662],{"type":43,"tag":75,"props":2663,"children":2664},{"__ignoreMap":758},[2665,2673,2681,2688,2696,2704,2712],{"type":43,"tag":764,"props":2666,"children":2667},{"class":766,"line":767},[2668],{"type":43,"tag":764,"props":2669,"children":2670},{},[2671],{"type":49,"value":2672},"label.SetBinding(Label.TextProperty,\n",{"type":43,"tag":764,"props":2674,"children":2675},{"class":766,"line":776},[2676],{"type":43,"tag":764,"props":2677,"children":2678},{},[2679],{"type":49,"value":2680},"    static (PersonViewModel vm) => vm.FullName);\n",{"type":43,"tag":764,"props":2682,"children":2683},{"class":766,"line":785},[2684],{"type":43,"tag":764,"props":2685,"children":2686},{"emptyLinePlaceholder":843},[2687],{"type":49,"value":846},{"type":43,"tag":764,"props":2689,"children":2690},{"class":766,"line":794},[2691],{"type":43,"tag":764,"props":2692,"children":2693},{},[2694],{"type":49,"value":2695},"entry.SetBinding(Entry.TextProperty,\n",{"type":43,"tag":764,"props":2697,"children":2698},{"class":766,"line":803},[2699],{"type":43,"tag":764,"props":2700,"children":2701},{},[2702],{"type":49,"value":2703},"    static (PersonViewModel vm) => vm.Age,\n",{"type":43,"tag":764,"props":2705,"children":2706},{"class":766,"line":812},[2707],{"type":43,"tag":764,"props":2708,"children":2709},{},[2710],{"type":49,"value":2711},"    mode: BindingMode.TwoWay,\n",{"type":43,"tag":764,"props":2713,"children":2714},{"class":766,"line":821},[2715],{"type":43,"tag":764,"props":2716,"children":2717},{},[2718],{"type":49,"value":2719},"    converter: new IntToStringConverter());\n",{"type":43,"tag":638,"props":2721,"children":2722},{},[],{"type":43,"tag":58,"props":2724,"children":2726},{"id":2725},"threading",[2727],{"type":49,"value":2728},"Threading",{"type":43,"tag":52,"props":2730,"children":2731},{},[2732,2734,2739,2741,2746,2748,2754],{"type":49,"value":2733},"MAUI automatically marshals ",{"type":43,"tag":75,"props":2735,"children":2737},{"className":2736},[],[2738],{"type":49,"value":1965},{"type":49,"value":2740}," to the UI thread — you can raise\nit from any thread. ",{"type":43,"tag":227,"props":2742,"children":2743},{},[2744],{"type":49,"value":2745},"However",{"type":49,"value":2747},", direct ",{"type":43,"tag":75,"props":2749,"children":2751},{"className":2750},[],[2752],{"type":49,"value":2753},"ObservableCollection",{"type":49,"value":2755}," mutations\n(Add \u002F Remove) from background threads may crash:",{"type":43,"tag":753,"props":2757,"children":2759},{"className":1640,"code":2758,"language":14,"meta":758,"style":758},"\u002F\u002F ✅ Safe — PropertyChanged is auto-marshalled\nawait Task.Run(() => Title = \"Loaded\");\n\n\u002F\u002F ⚠️ ObservableCollection.Add — dispatch to UI thread\nMainThread.BeginInvokeOnMainThread(() => Items.Add(newItem));\n",[2760],{"type":43,"tag":75,"props":2761,"children":2762},{"__ignoreMap":758},[2763,2771,2779,2786,2794],{"type":43,"tag":764,"props":2764,"children":2765},{"class":766,"line":767},[2766],{"type":43,"tag":764,"props":2767,"children":2768},{},[2769],{"type":49,"value":2770},"\u002F\u002F ✅ Safe — PropertyChanged is auto-marshalled\n",{"type":43,"tag":764,"props":2772,"children":2773},{"class":766,"line":776},[2774],{"type":43,"tag":764,"props":2775,"children":2776},{},[2777],{"type":49,"value":2778},"await Task.Run(() => Title = \"Loaded\");\n",{"type":43,"tag":764,"props":2780,"children":2781},{"class":766,"line":785},[2782],{"type":43,"tag":764,"props":2783,"children":2784},{"emptyLinePlaceholder":843},[2785],{"type":49,"value":846},{"type":43,"tag":764,"props":2787,"children":2788},{"class":766,"line":794},[2789],{"type":43,"tag":764,"props":2790,"children":2791},{},[2792],{"type":49,"value":2793},"\u002F\u002F ⚠️ ObservableCollection.Add — dispatch to UI thread\n",{"type":43,"tag":764,"props":2795,"children":2796},{"class":766,"line":803},[2797],{"type":43,"tag":764,"props":2798,"children":2799},{},[2800],{"type":49,"value":2801},"MainThread.BeginInvokeOnMainThread(() => Items.Add(newItem));\n",{"type":43,"tag":638,"props":2803,"children":2804},{},[],{"type":43,"tag":58,"props":2806,"children":2808},{"id":2807},"common-pitfalls",[2809],{"type":49,"value":2810},"Common Pitfalls",{"type":43,"tag":329,"props":2812,"children":2813},{},[2814,2830],{"type":43,"tag":333,"props":2815,"children":2816},{},[2817],{"type":43,"tag":337,"props":2818,"children":2819},{},[2820,2825],{"type":43,"tag":341,"props":2821,"children":2822},{},[2823],{"type":49,"value":2824},"Mistake",{"type":43,"tag":341,"props":2826,"children":2827},{},[2828],{"type":49,"value":2829},"Fix",{"type":43,"tag":357,"props":2831,"children":2832},{},[2833,2880,2906,2939,2963,2989,3002,3022],{"type":43,"tag":337,"props":2834,"children":2835},{},[2836,2848],{"type":43,"tag":364,"props":2837,"children":2838},{},[2839,2841,2846],{"type":49,"value":2840},"Missing ",{"type":43,"tag":75,"props":2842,"children":2844},{"className":2843},[],[2845],{"type":49,"value":80},{"type":49,"value":2847}," — bindings silently fall back to reflection",{"type":43,"tag":364,"props":2849,"children":2850},{},[2851,2853,2858,2860,2865,2867,2872,2874,2879],{"type":49,"value":2852},"Add ",{"type":43,"tag":75,"props":2854,"children":2856},{"className":2855},[],[2857],{"type":49,"value":80},{"type":49,"value":2859}," at page root and every ",{"type":43,"tag":75,"props":2861,"children":2863},{"className":2862},[],[2864],{"type":49,"value":393},{"type":49,"value":2866},"; promote ",{"type":43,"tag":75,"props":2868,"children":2870},{"className":2869},[],[2871],{"type":49,"value":1013},{"type":49,"value":2873}," (see ",{"type":43,"tag":285,"props":2875,"children":2877},{"href":2876},"#enforce-binding-warnings-as-errors",[2878],{"type":49,"value":980},{"type":49,"value":174},{"type":43,"tag":337,"props":2881,"children":2882},{},[2883,2893],{"type":43,"tag":364,"props":2884,"children":2885},{},[2886,2888],{"type":49,"value":2887},"Forgetting to set ",{"type":43,"tag":75,"props":2889,"children":2891},{"className":2890},[],[2892],{"type":49,"value":144},{"type":43,"tag":364,"props":2894,"children":2895},{},[2896,2898,2904],{"type":49,"value":2897},"Set in XAML (",{"type":43,"tag":75,"props":2899,"children":2901},{"className":2900},[],[2902],{"type":49,"value":2903},"\u003CPage.BindingContext>",{"type":49,"value":2905},") or inject via constructor",{"type":43,"tag":337,"props":2907,"children":2908},{},[2909,2927],{"type":43,"tag":364,"props":2910,"children":2911},{},[2912,2914,2920,2921],{"type":49,"value":2913},"Specifying redundant ",{"type":43,"tag":75,"props":2915,"children":2917},{"className":2916},[],[2918],{"type":49,"value":2919},"Mode=OneWay",{"type":49,"value":114},{"type":43,"tag":75,"props":2922,"children":2924},{"className":2923},[],[2925],{"type":49,"value":2926},"Mode=TwoWay",{"type":43,"tag":364,"props":2928,"children":2929},{},[2930,2932,2937],{"type":49,"value":2931},"Omit ",{"type":43,"tag":75,"props":2933,"children":2935},{"className":2934},[],[2936],{"type":49,"value":1280},{"type":49,"value":2938}," when using the control's default",{"type":43,"tag":337,"props":2940,"children":2941},{},[2942,2952],{"type":43,"tag":364,"props":2943,"children":2944},{},[2945,2947],{"type":49,"value":2946},"ViewModel does not implement ",{"type":43,"tag":75,"props":2948,"children":2950},{"className":2949},[],[2951],{"type":49,"value":93},{"type":43,"tag":364,"props":2953,"children":2954},{},[2955,2956,2961],{"type":49,"value":2540},{"type":43,"tag":75,"props":2957,"children":2959},{"className":2958},[],[2960],{"type":49,"value":101},{"type":49,"value":2962}," from CommunityToolkit.Mvvm or implement manually",{"type":43,"tag":337,"props":2964,"children":2965},{},[2966,2978],{"type":43,"tag":364,"props":2967,"children":2968},{},[2969,2971,2976],{"type":49,"value":2970},"Mutating ",{"type":43,"tag":75,"props":2972,"children":2974},{"className":2973},[],[2975],{"type":49,"value":2753},{"type":49,"value":2977}," off the UI thread",{"type":43,"tag":364,"props":2979,"children":2980},{},[2981,2983],{"type":49,"value":2982},"Wrap mutations in ",{"type":43,"tag":75,"props":2984,"children":2986},{"className":2985},[],[2987],{"type":49,"value":2988},"MainThread.BeginInvokeOnMainThread",{"type":43,"tag":337,"props":2990,"children":2991},{},[2992,2997],{"type":43,"tag":364,"props":2993,"children":2994},{},[2995],{"type":49,"value":2996},"Complex converter chains in hot paths",{"type":43,"tag":364,"props":2998,"children":2999},{},[3000],{"type":49,"value":3001},"Pre-compute values in the ViewModel instead",{"type":43,"tag":337,"props":3003,"children":3004},{},[3005,3017],{"type":43,"tag":364,"props":3006,"children":3007},{},[3008,3010,3015],{"type":49,"value":3009},"Using ",{"type":43,"tag":75,"props":3011,"children":3013},{"className":3012},[],[3014],{"type":49,"value":438},{"type":49,"value":3016}," to escape compiled bindings",{"type":43,"tag":364,"props":3018,"children":3019},{},[3020],{"type":49,"value":3021},"Restructure bindings; keep compile-time safety",{"type":43,"tag":337,"props":3023,"children":3024},{},[3025,3030],{"type":43,"tag":364,"props":3026,"children":3027},{},[3028],{"type":49,"value":3029},"Binding to non-public properties",{"type":43,"tag":364,"props":3031,"children":3032},{},[3033,3035,3041],{"type":49,"value":3034},"Binding targets must be ",{"type":43,"tag":75,"props":3036,"children":3038},{"className":3037},[],[3039],{"type":49,"value":3040},"public",{"type":49,"value":3042}," properties (fields are ignored)",{"type":43,"tag":638,"props":3044,"children":3045},{},[],{"type":43,"tag":58,"props":3047,"children":3049},{"id":3048},"references",[3050],{"type":49,"value":3051},"References",{"type":43,"tag":65,"props":3053,"children":3054},{},[3055,3065,3075,3085,3095,3105],{"type":43,"tag":69,"props":3056,"children":3057},{},[3058],{"type":43,"tag":285,"props":3059,"children":3062},{"href":3060,"rel":3061},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002F",[289],[3063],{"type":49,"value":3064},"Data binding overview",{"type":43,"tag":69,"props":3066,"children":3067},{},[3068],{"type":43,"tag":285,"props":3069,"children":3072},{"href":3070,"rel":3071},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Fcompiled-bindings",[289],[3073],{"type":49,"value":3074},"Compiled bindings",{"type":43,"tag":69,"props":3076,"children":3077},{},[3078],{"type":43,"tag":285,"props":3079,"children":3082},{"href":3080,"rel":3081},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Fconverters",[289],[3083],{"type":49,"value":3084},"Value converters",{"type":43,"tag":69,"props":3086,"children":3087},{},[3088],{"type":43,"tag":285,"props":3089,"children":3092},{"href":3090,"rel":3091},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Frelative-bindings",[289],[3093],{"type":49,"value":3094},"Relative bindings",{"type":43,"tag":69,"props":3096,"children":3097},{},[3098],{"type":43,"tag":285,"props":3099,"children":3102},{"href":3100,"rel":3101},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fmaui\u002Ffundamentals\u002Fdata-binding\u002Fmultibindings",[289],[3103],{"type":49,"value":3104},"Multi-bindings",{"type":43,"tag":69,"props":3106,"children":3107},{},[3108],{"type":43,"tag":285,"props":3109,"children":3112},{"href":3110,"rel":3111},"https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fcommunitytoolkit\u002Fmvvm\u002F",[289],[3113],{"type":49,"value":3114},"CommunityToolkit.Mvvm",{"type":43,"tag":3116,"props":3117,"children":3118},"style",{},[3119],{"type":49,"value":3120},"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":3122,"total":3287},[3123,3141,3156,3171,3189,3203,3221,3231,3243,3253,3266,3277],{"slug":3124,"name":3124,"fn":3125,"description":3126,"org":3127,"tags":3128,"stars":3138,"repoUrl":3139,"updatedAt":3140},"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},[3129,3132,3135],{"name":3130,"slug":3131,"type":15},".NET","net",{"name":3133,"slug":3134,"type":15},"Engineering","engineering",{"name":3136,"slug":3137,"type":15},"Performance","performance",5535,"https:\u002F\u002Fgithub.com\u002Fdotnet\u002Fmsbuild","2026-07-22T05:37:33.965588",{"slug":3142,"name":3142,"fn":3143,"description":3144,"org":3145,"tags":3146,"stars":25,"repoUrl":26,"updatedAt":3155},"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},[3147,3148,3151,3154],{"name":3130,"slug":3131,"type":15},{"name":3149,"slug":3150,"type":15},"Code Analysis","code-analysis",{"name":3152,"slug":3153,"type":15},"Debugging","debugging",{"name":3136,"slug":3137,"type":15},"2026-07-12T08:23:25.400375",{"slug":3157,"name":3157,"fn":3158,"description":3159,"org":3160,"tags":3161,"stars":25,"repoUrl":26,"updatedAt":3170},"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},[3162,3163,3166,3167],{"name":3130,"slug":3131,"type":15},{"name":3164,"slug":3165,"type":15},"Android","android",{"name":3152,"slug":3153,"type":15},{"name":3168,"slug":3169,"type":15},"Microsoft","microsoft","2026-07-12T08:23:21.595572",{"slug":3172,"name":3172,"fn":3173,"description":3174,"org":3175,"tags":3176,"stars":25,"repoUrl":26,"updatedAt":3188},"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},[3177,3178,3179,3182,3185],{"name":3130,"slug":3131,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3180,"slug":3181,"type":15},"iOS","ios",{"name":3183,"slug":3184,"type":15},"macOS","macos",{"name":3186,"slug":3187,"type":15},"Observability","observability","2026-07-12T08:23:20.369986",{"slug":3190,"name":3190,"fn":3191,"description":3192,"org":3193,"tags":3194,"stars":25,"repoUrl":26,"updatedAt":3202},"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},[3195,3196,3199],{"name":3149,"slug":3150,"type":15},{"name":3197,"slug":3198,"type":15},"QA","qa",{"name":3200,"slug":3201,"type":15},"Testing","testing","2026-07-12T08:23:51.277743",{"slug":3204,"name":3204,"fn":3205,"description":3206,"org":3207,"tags":3208,"stars":25,"repoUrl":26,"updatedAt":3220},"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},[3209,3210,3213,3214,3217],{"name":3130,"slug":3131,"type":15},{"name":3211,"slug":3212,"type":15},"Blazor","blazor",{"name":13,"slug":14,"type":15},{"name":3215,"slug":3216,"type":15},"UI Components","ui-components",{"name":3218,"slug":3219,"type":15},"Web Development","web-development","2026-07-15T06:03:29.216359",{"slug":3222,"name":3222,"fn":3223,"description":3224,"org":3225,"tags":3226,"stars":25,"repoUrl":26,"updatedAt":3230},"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},[3227,3228,3229],{"name":3149,"slug":3150,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3168,"slug":3169,"type":15},"2026-07-12T08:21:34.637923",{"slug":3232,"name":3232,"fn":3233,"description":3234,"org":3235,"tags":3236,"stars":25,"repoUrl":26,"updatedAt":3242},"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},[3237,3240,3241],{"name":3238,"slug":3239,"type":15},"Build","build",{"name":3152,"slug":3153,"type":15},{"name":3133,"slug":3134,"type":15},"2026-07-19T05:38:19.340791",{"slug":3244,"name":3244,"fn":3245,"description":3246,"org":3247,"tags":3248,"stars":25,"repoUrl":26,"updatedAt":3252},"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},[3249,3250,3251],{"name":3130,"slug":3131,"type":15},{"name":3133,"slug":3134,"type":15},{"name":3136,"slug":3137,"type":15},"2026-07-19T05:38:18.364937",{"slug":3254,"name":3254,"fn":3255,"description":3256,"org":3257,"tags":3258,"stars":25,"repoUrl":26,"updatedAt":3265},"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},[3259,3260,3263,3264],{"name":3133,"slug":3134,"type":15},{"name":3261,"slug":3262,"type":15},"Monitoring","monitoring",{"name":3136,"slug":3137,"type":15},{"name":3200,"slug":3201,"type":15},"2026-07-12T08:21:35.865649",{"slug":3267,"name":3267,"fn":3268,"description":3269,"org":3270,"tags":3271,"stars":25,"repoUrl":26,"updatedAt":3276},"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},[3272,3273,3274,3275],{"name":3130,"slug":3131,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3133,"slug":3134,"type":15},{"name":3136,"slug":3137,"type":15},"2026-07-12T08:21:40.961722",{"slug":3278,"name":3278,"fn":3279,"description":3280,"org":3281,"tags":3282,"stars":25,"repoUrl":26,"updatedAt":3286},"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},[3283,3284,3285],{"name":3152,"slug":3153,"type":15},{"name":3133,"slug":3134,"type":15},{"name":3197,"slug":3198,"type":15},"2026-07-19T05:38:14.336279",144,{"items":3289,"total":3338},[3290,3297,3304,3312,3318,3326,3332],{"slug":3142,"name":3142,"fn":3143,"description":3144,"org":3291,"tags":3292,"stars":25,"repoUrl":26,"updatedAt":3155},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3293,3294,3295,3296],{"name":3130,"slug":3131,"type":15},{"name":3149,"slug":3150,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3136,"slug":3137,"type":15},{"slug":3157,"name":3157,"fn":3158,"description":3159,"org":3298,"tags":3299,"stars":25,"repoUrl":26,"updatedAt":3170},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3300,3301,3302,3303],{"name":3130,"slug":3131,"type":15},{"name":3164,"slug":3165,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3168,"slug":3169,"type":15},{"slug":3172,"name":3172,"fn":3173,"description":3174,"org":3305,"tags":3306,"stars":25,"repoUrl":26,"updatedAt":3188},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3307,3308,3309,3310,3311],{"name":3130,"slug":3131,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3180,"slug":3181,"type":15},{"name":3183,"slug":3184,"type":15},{"name":3186,"slug":3187,"type":15},{"slug":3190,"name":3190,"fn":3191,"description":3192,"org":3313,"tags":3314,"stars":25,"repoUrl":26,"updatedAt":3202},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3315,3316,3317],{"name":3149,"slug":3150,"type":15},{"name":3197,"slug":3198,"type":15},{"name":3200,"slug":3201,"type":15},{"slug":3204,"name":3204,"fn":3205,"description":3206,"org":3319,"tags":3320,"stars":25,"repoUrl":26,"updatedAt":3220},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3321,3322,3323,3324,3325],{"name":3130,"slug":3131,"type":15},{"name":3211,"slug":3212,"type":15},{"name":13,"slug":14,"type":15},{"name":3215,"slug":3216,"type":15},{"name":3218,"slug":3219,"type":15},{"slug":3222,"name":3222,"fn":3223,"description":3224,"org":3327,"tags":3328,"stars":25,"repoUrl":26,"updatedAt":3230},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3329,3330,3331],{"name":3149,"slug":3150,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3168,"slug":3169,"type":15},{"slug":3232,"name":3232,"fn":3233,"description":3234,"org":3333,"tags":3334,"stars":25,"repoUrl":26,"updatedAt":3242},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3335,3336,3337],{"name":3238,"slug":3239,"type":15},{"name":3152,"slug":3153,"type":15},{"name":3133,"slug":3134,"type":15},96]