Skip to content

Add Binding converter culture support - #35821

Merged
jfversluis merged 4 commits into
net11.0from
jfversluis/binding-converter-culture
Jul 1, 2026
Merged

Add Binding converter culture support#35821
jfversluis merged 4 commits into
net11.0from
jfversluis/binding-converter-culture

Conversation

@jfversluis

@jfversluis jfversluis commented Jun 9, 2026

Copy link
Copy Markdown
Member

Note

Are you waiting for the changes in this PR to be merged?
It would be very helpful if you could test the resulting artifacts from this PR and let us know in a comment if this change resolves your issue. Thank you!

Description

Adds Binding.ConverterCulture support for #5696 so bindings can pass an explicit CultureInfo to IValueConverter.Convert and ConvertBack instead of always using CultureInfo.CurrentUICulture.

The implementation preserves existing Binding constructor signatures and wires the property through runtime bindings, typed bindings, runtime XAML, XamlC, and source-generated XAML.

This intentionally does not add new ConverterCulture APIs to MultiBinding or TemplateBinding. MultiBinding parity can be considered separately, and TemplateBinding has no ConverterCulture property to propagate.

Issues Fixed

Fixes #5696

Testing

  • git diff --check
  • dotnet build src/Controls/src/Build.Tasks/Controls.Build.Tasks.csproj --no-restore
  • dotnet build src/Controls/src/SourceGen/Controls.SourceGen.csproj --no-restore
  • dotnet test src/Controls/tests/BindingSourceGen.UnitTests/Controls.BindingSourceGen.UnitTests.csproj --no-restore
  • dotnet test src/Controls/tests/SourceGen.UnitTests/SourceGen.UnitTests.csproj --no-restore
  • LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 dotnet test src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj --no-restore
  • LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 dotnet test src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj --no-restore -p:WarningsNotAsErrors=XC0618%3BXC0619%3BXC0022%3BXC0023%3BXC0025%3BXC0045%3BXC0067%3BMAUIG2045%3BMAUID1000%3BMAUIX2005%3BMAUIX2015%3BMAUIX2017

@github-actions

github-actions Bot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35821

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35821"

@github-actions github-actions Bot added the area-xaml XAML, CSS, Triggers, Behaviors label Jun 9, 2026
@kubaflo

kubaflo commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

AI code review refresh for net11.0 target

Head reviewed: 755e88460be8df7394148f32819e740ace0fbe03
Target: net11.0 · State: Open (Draft)
Verdict: 🟡 Needs discussion (implementation is solid; one parity question + CI is red for unrelated reasons)

Summary

Independent read of the diff before the narrative. Binding.ConverterCulture is wired consistently through every binding path:

  • Runtime Binding / TypedBindingBase (GetSourceValue/GetTargetValue now pass ConverterCulture instead of hardcoded CultureInfo.CurrentUICulture)
  • Runtime XAML (BindingExtension), XamlC IL (SetPropertiesVisitor), source‑gen compiled (CompiledBindingMarkup) and reflection markup (KnownMarkups)
  • PublicAPI.Unshipped.txt updated across all TFMs for both Core and Xaml assemblies.

The default getter _converterCulture ?? CultureInfo.CurrentUICulture preserves prior behavior, and Clone() copies the raw field (not the resolved value), so an unset culture stays dynamic. This is correct and explicitly covered by tests.

What's good

  • Backwards compatible: existing constructors untouched; default behavior unchanged when ConverterCulture is not set.
  • Strong test coverage: BindingConverterCultureTests exercises runtime + typed bindings, explicit override, and clone semantics (both explicit-preserved and unset-stays-dynamic). Maui5696.xaml runs across all inflators (Runtime/XamlC/SourceGen), matching repo conventions (internal void + [XamlInflatorData] + nested [Collection("Issue")]).

Findings (non-blocking)

  1. [Medium] MultiBinding has no parity. MultiBinding still hardcodes CultureInfo.CurrentUICulture (src/Controls/src/Core/MultiBinding.cs:211,230). If MultiBinding is intentionally out of scope for Add ConverterCulture property on Binding to allow overriding of culture settings #5696, a one-line note in the PR description would avoid confusion; otherwise consider a follow-up.
  2. [Low] Template bindings excluded. CompiledBindingMarkup gates with !isTemplateBinding && _node.HasProperty("ConverterCulture"), so ConverterCulture is silently dropped for template bindings. Confirm this is intended (TemplateBinding has no such property) so it isn't a surprise.
  3. [Low] Null setter resets to dynamic. Setting ConverterCulture = null reverts to CurrentUICulture; PublicAPI ~ (nullable-oblivious) entries are consistent with the surrounding file. Fine, just noting the semantics.

CI note

maui-pr is red, but every failure I inspected is unrelated to this change:

  • Build macOS (Debug) — infra error MSB4019: …/.buildtasks/Microsoft.Maui.Core.props was not found (build-tasks not staged), not a source/compile error from this PR.
  • Windows Helix Unit Tests (Release) — only Microsoft.Maui.Essentials.AI.UnitTests.dll failed (9/10 work items passed); Essentials AI is unrelated to Controls/binding. The Controls/XAML unit-test work items passed, which is positive signal that the new tests are green.
  • RunOniOS MauiRelease / TrimFull / AOT — pre-existing IL2026 trim-analysis errors in HybridWebViewHandler (System.Text.Json), → NETSDK1144. Unrelated to binding culture.
  • Build Analysis red reflects the above.

No PR-caused CI failure was identified. I did not exhaustively open every job, so attribution is high-confidence but not absolute.

Confidence

Code correctness: medium‑high. CI attribution: medium‑high.


⚠️ Non-approval disclaimer: This is an automated AI review refresh for the net11.0 target. It is not an approval and does not constitute a --approve/--request-changes review. A human maintainer must make the merge decision. The PR is currently a draft.

@jfversluis

jfversluis commented Jun 12, 2026

Copy link
Copy Markdown
Member Author

@StephaneDelcroix would you mind taking a look at this one when you have a chance? This targets net11.0 and adds Binding.ConverterCulture support for #5696.

@jfversluis
jfversluis marked this pull request as ready for review June 12, 2026 15:15
@kubaflo

kubaflo commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

AI code review refresh for net11.0 target

Head reviewed: 0a97f917588d6e37c7f8c5ecc51eb75d612897e7
Target: net11.0 · State: Open
Verdict: 🟢 LGTM — the prior round's parity gap is now closed; CI red is entirely unrelated/pre-existing.

What changed since the last refresh (755e884)

  • 922c304Trigger CI (no source change)
  • 0a97f91Add MultiBinding converter culture support

This directly resolves the [Medium] finding from the round‑14 review (MultiBinding previously hardcoded CultureInfo.CurrentUICulture).

Independent diff read

ConverterCulture is now wired consistently across every binding surface:

  • Runtime Binding, TypedBindingBase, and now MultiBindingGetSourceValue/GetTargetValue/ConvertBack pass ConverterCulture instead of the hardcoded CultureInfo.CurrentUICulture.
  • XAML paths: BindingExtension, XamlC IL (SetPropertiesVisitor), source‑gen compiled (CompiledBindingMarkup), reflection markup (KnownMarkups).
  • PublicAPI.Unshipped.txt updated across all TFMs for both Core and Xaml assemblies (Binding, MultiBinding, TypedBindingBase getters/setters).

The default getter _converterCulture ?? CultureInfo.CurrentUICulture preserves legacy behavior, and MultiBinding.Clone() copies the raw field (ConverterCulture = _converterCulture) — matching the Binding/TypedBinding pattern, so an unset culture stays dynamic. Correct and consistent.

Prior review reconciliation (round 14)

  1. [Medium] MultiBinding parity → ✅ Resolved in 0a97f91. MultiBinding.ConverterCulture added with [TypeConverter(typeof(CultureInfoConverter))], ThrowIfApplied() guard, clone preservation, and pass-through in both Convert/ConvertBack. New tests cover convert, convert-back, explicit-preserved clone, and dynamic-default clone.
  2. [Low] Template bindings excluded → unchanged; still gated by !isTemplateBinding && _node.HasProperty("ConverterCulture") in CompiledBindingMarkup. Intentional (TemplateBinding has no ConverterCulture property).
  3. [Low] ConverterCulture = null reverts to dynamic → unchanged; PublicAPI ~ (nullable‑oblivious) entries remain consistent. Noted, not blocking.

Findings this round

None new. The previously noted low‑severity items are intentional design choices, not defects.

CI status (build 1461702)

maui-pr and Build Analysis are red, but every failure I inspected is unrelated to this change:

  • Windows Helix Unit Tests (Debug) — only failed work item is Microsoft.Maui.Essentials.AI.UnitTests.dll; all four Controls/XAML unit-test runs report 0 failed (4652/4685, 4650/4685, 4643/4678 ×2 — remainder skipped). Strong positive signal that the new binding-culture tests are green.
  • RunOniOS MauiReleaseTrimFull / TrimFull_CoreCLR & AOT macOS — pre-existing IL2026 trim-analysis errors against System.Text.Json/HybridWebViewNETSDK1144 (124× IL2026 in the trim log). Same failure class as round 14; not introduced here.
  • Build Analysis red reflects the above.

The round‑14 macOS Debug build infra error (MSB4019) is gone this round — that build now passes.

Blast radius

Binding infrastructure is high‑fanout, but the change is additive and opt‑in: behavior only differs when ConverterCulture is explicitly set; otherwise the resolved value is the unchanged CultureInfo.CurrentUICulture. Clone semantics preserve the dynamic-default. No threading concern introduced (still reads a per-binding field/ambient culture at convert time).

Confidence

Code correctness: high. CI attribution: medium‑high (I did not exhaustively open every job, but failed work items were inspected directly).


⚠️ Non-approval disclaimer: This is an automated AI review refresh for the net11.0 target. It is not an approval and does not constitute a --approve/--request-changes review. A human maintainer must make the merge decision.

@kubaflo kubaflo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #35821 — Add Binding ConverterCulture support (issue #5696)

Verdict: NEEDS_DISCUSSION (confidence: medium) — HEAD 0a97f91. The code is well-structured — 3 of 4 models (gpt-5.5, opus-4.6, gemini) return LGTM with only minor suggestions (opus-4.8 timed out without a verdict). The hold is a PR-specific CI failure, below.

Implementation

Adds a ConverterCulture to Binding/MultiBinding/TypedBinding, the XAML BindingExtension, and threads it through both the XamlC (SetPropertiesVisitor) and source-generated (CompiledBindingMarkup/KnownMarkups) binding paths, with PublicAPI.Unshipped.txt entries across all TFMs. Unit tests (BindingConverterCultureTests, MultiBindingTests) and a XAML test (Maui5696 using ConverterCulture='nl-NL') are included.

⚠️ Blocking question — Windows Helix unit-test (Debug) leg is red only on this PR

maui-pr → Run Helix Unit Tests Windows (Debug) is failing on this head (buildId 1461702), while the Release variant passes. I checked the same Debug leg on 4 other concurrently-open PRs (#35597, #35265, #34136, #35922) — it is green on all of them, so this is not the usual flake; it is specific to this PR, which adds the new binding-culture tests.

Likely root cause to check: whether the ConverterCulture string (e.g. 'nl-NL' in Maui5696.xaml) is converted to a CultureInfo (via CultureInfoConverter) consistently across all three binding paths — runtime reflection, XamlC (SetPropertiesVisitor), and SourceGen (KnownMarkups). If one path leaves it as a raw string or applies a different default (CurrentCulture vs InvariantCulture), a culture assertion would fail. Please confirm which test fails on the Windows Debug leg and fix, or confirm it's an unrelated flake via rerun.

Minor suggestions (inline, non-blocking)

  • 💡 KnownMarkups.cs:455 — generated code allocates a new CultureInfoConverter per binding; consider caching.
  • 💡 SetPropertiesVisitor.cs:387 — consider ConverterCulture parity for TemplateBindingExtension.

The other red legs (Build Analysis, AOT macOS, RunOniOS_MauiRelease/TrimFull/CoreCLR) are the known unrelated flakes.

if (converterCultureNode is ValueNode { Value: string converterCulture })
{
expression += $"ConverterCulture = (global::System.Globalization.CultureInfo)new global::System.ComponentModel.CultureInfoConverter().ConvertFromInvariantString({SymbolDisplay.FormatLiteral(converterCulture, true)})!, ";
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The source-generated binding code instantiates a fresh CultureInfoConverter for each binding when a ConverterCulture string is present. Since CultureInfoConverter is stateless, consider emitting a single cached/static converter (or converting the culture string once at generation time into a CultureInfo.GetCultureInfo("...") call) to avoid a per-binding allocation on a hot path. Minor — not blocking.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good suggestion — addressed in e21a5d0. Literal converter culture values now emit CultureInfo.GetCultureInfo("..."), so generated code no longer allocates a CultureInfoConverter per binding.


if (bindingExtensionType.Value.Item3 == "BindingExtension")
{
// extension.TypedBinding.ConverterCulture = extension.ConverterCulture;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For full parity, consider whether ConverterCulture should also be supported on TemplateBindingExtension, which shares much of this binding-construction path. Right now ConverterCulture is wired for Binding/MultiBinding but a TemplateBinding with a converter won't honor a culture. Non-blocking — flagging for completeness/consistency.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Leaving this out intentionally for this PR. TemplateBindingExtension currently has no ConverterCulture API surface, so adding parity there would require a separate public API addition beyond the Binding/MultiBinding support in scope here.

@jfversluis

Copy link
Copy Markdown
Member Author

Addressed the source-gen allocation review comment in e21a5d0 by emitting CultureInfo.GetCultureInfo(...) for literal ConverterCulture strings. I also checked the Windows Debug Helix failure from build 1461702: the failed work item is Microsoft.Maui.Essentials.AI.UnitTests.dll, specifically StreamingJsonDeserializerTests.FileBasedTests.ProcessChunk_TxtFile_DeserializesProgressively(... maui-itinerary-5.txt ...), so it is unrelated to the binding/XAML tests in this PR.

@kubaflo

kubaflo commented Jun 16, 2026

Copy link
Copy Markdown
Contributor

✅ LGTM — no blocking issues found

Re-review PR #35821 — Binding ConverterCulture support (new head e21a5d0)

Verdict: LGTM (confidence: high) — the previously-blocking issue is resolved. 🎉

What changed

The one-line fix in KnownMarkups.cs replaces
ConverterCulture = (CultureInfo)new CultureInfoConverter().ConvertFromInvariantString(...)
with
ConverterCulture = CultureInfo.GetCultureInfo(...).

This does two good things at once:

  1. Fixes the PR-specific Windows Helix unit-test failure I flagged last round — the Run Helix Unit Tests Windows (Debug) and (Release) legs now pass on this head (build 1466073). The old CultureInfoConverter().ConvertFromInvariantString(...) path was the culprit; CultureInfo.GetCultureInfo(...) is the canonical, well-defined parse.
  2. Addresses my earlier suggestion about the per-binding CultureInfoConverter allocation — GetCultureInfo is cached internally, so there's no per-binding converter allocation on the source-generated path anymore.

Assessment

The original review already had the code at 3/4 models LGTM; the only reason it was held at NEEDS_DISCUSSION was that PR-specific Windows test failure, which is now fixed. The ConverterCulture wiring across the runtime / XamlC / SourceGen paths is consistent, and the PublicAPI entries are present across all TFMs.

Non-blocking (optional, from last round)

  • 💡 Consider ConverterCulture parity for TemplateBindingExtension (it shares the binding-construction path). Purely a completeness nice-to-have — not required for this PR.

CI

The Windows build + Helix unit-test legs are green/pending-green; the remaining red legs (AOT macOS, RunOniOS_MauiRelease/TrimFull/CoreCLR) are the known unrelated infra flakes. Ready for human review/merge once the full maui-pr build (currently pending) completes green.

Multi-model review (gpt-5.5 · opus-4.8 · opus-4.6 · gemini-3.1-pro). Comments only — not a formal approval.

@jfversluis
jfversluis force-pushed the jfversluis/binding-converter-culture branch from e21a5d0 to 21eeedc Compare June 17, 2026 09:23
@kubaflo

kubaflo commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

✅ LGTM — no blocking issues found

Re-review PR #35821 — Add Binding ConverterCulture support (issue #5696)

Verdict: LGTM (confidence: high) — HEAD 21eeedca. Unanimous: all 4 models (gpt-5.5, opus-4.8, opus-4.6, gemini-3.1-pro) approved with 0 findings, and independent HEAD validation confirms it.

What changed

The PR adds Binding.ConverterCulture so a binding can pass an explicit CultureInfo to IValueConverter.Convert/ConvertBack instead of always using CultureInfo.CurrentUICulture (483 additions, 25 files). The property is wired consistently across runtime Binding/TypedBinding/MultiBinding, runtime XAML, XamlC IL, and source-generated XAML, with full PublicAPI.Unshipped.txt entries across every TFM. The new HEAD commit 21eeedca ("Optimize generated converter culture literals") is a single-line source-gen change in KnownMarkups.cs, replacing a per-binding new CultureInfoConverter().ConvertFromInvariantString(...) with the internally-cached CultureInfo.GetCultureInfo(...). This content is identical to the previously-approved head e21a5d01; the branch was simply rebased onto net11.0 (which explains gemini's "rebase" framing vs. the other models' "code change" framing — both describe the same end state).

Validation

I confirmed the three correctness-critical points against HEAD code rather than trusting the model summaries: (1) the getter resolves an unset value dynamically — get { return _converterCulture ?? CultureInfo.CurrentUICulture; } (Binding.cs:91); (2) Clone() copies the raw backing field — ConverterCulture = _converterCulture (Binding.cs:214) — correctly preserving the unset (dynamic CurrentUICulture) vs. explicit distinction; and (3) the source-gen GetCultureInfo literal is strictly better than the old converter allocation and semantically equivalent for the realistic culture-name inputs XAML produces (e.g. en-US). The earlier round's only actionable suggestion (the source-gen converter allocation) is now resolved by this very commit; MultiBinding parity was added in aed0df46; and TemplateBinding parity was intentionally and explicitly scoped out in the PR description ("TemplateBinding has no ConverterCulture property to propagate"), so re-raising it would be noise.

CI

The remaining red legs (AOT macOS, RunOniOS_MauiRelease/TrimFull/CoreCLR) build generic template apps that do not use ConverterCulture and fail inconsistently across runtime variants (Debug + CoreCLR-Release pass, Mono-Release fails) — a known infra/trim flakiness signature, not attributable to this PR. The relevant build and Helix unit-test legs pass. Ready for human review/merge once the full maui-pr build settles.

Multi-model review (gpt-5.5 · opus-4.8 · opus-4.6 · gemini-3.1-pro). Comments only — not a formal approval.

@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jun 18, 2026
@MauiBot MauiBot added s/agent-fix-win AI found a better alternative fix than the PR s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) labels Jun 18, 2026
MauiBot

This comment was marked as outdated.

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jun 19, 2026
@jfversluis
jfversluis force-pushed the jfversluis/binding-converter-culture branch from 21eeedc to 4c07549 Compare June 23, 2026 12:34
@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jun 23, 2026
@MauiBot MauiBot added the s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates label Jun 23, 2026
jfversluis and others added 4 commits June 24, 2026 10:44
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@jfversluis
jfversluis force-pushed the jfversluis/binding-converter-culture branch from 4c07549 to b511afb Compare June 24, 2026 08:44
@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jun 24, 2026
MauiBot

This comment was marked as outdated.

@kubaflo

This comment has been minimized.

@github-actions github-actions Bot added the s/agent-review-in-progress AI review is currently running for this PR label Jul 1, 2026

@StephaneDelcroix StephaneDelcroix left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

approving the API changes

@jfversluis
jfversluis merged commit 5fc3676 into net11.0 Jul 1, 2026
28 of 31 checks passed
@jfversluis
jfversluis deleted the jfversluis/binding-converter-culture branch July 1, 2026 12:45
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

🚨 API change(s) detected @davidbritch FYI

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

🚨 API change(s) detected @davidortinau FYI

@MauiBot MauiBot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Review Summary

@jfversluis — new AI review results are available based on this last commit: b511afb. To request a fresh review after new comments or commits, comment /review rerun.

Gate Inconclusive Confidence Low Platform Android


🗂️ Review Sessions — click to expand
🚦 Gate — Test Before & After Fix

Gate Result: ⚠️ INCONCLUSIVE

Platform: ANDROID · Base: net11.0 · Merge base: 9ee0adb3

🩺 Fix does not compile — applying the PR's fix produces a build error before tests can run. The earlier-than-test failure is the root cause; the per-test ❌ FAIL marks are downstream effects, not real test failures.

/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Bz40906.xaml(6,4): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vs...

Test Without Fix (expect FAIL) With Fix (expect PASS)
🧪 BindingConverterCultureTests BindingConverterCultureTests 🛠️ BUILD ERROR ✅ PASS — 153s
🧪 MultiBindingTests MultiBindingTests 🛠️ BUILD ERROR ✅ PASS — 41s
📄 Maui5696 Maui5696 🛠️ BUILD ERROR 🛠️ BUILD ERROR
🔴 Without fix — 🧪 BindingConverterCultureTests: 🛠️ BUILD ERROR · 84s
  Determining projects to restore...
  Restored /home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj (in 1.29 sec).
  10 of 11 projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net11.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net11.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net11.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Core.HybridWebViewSourceGen -> /home/vsts/work/1/s/artifacts/bin/Core.HybridWebViewSourceGen/Debug/netstandard2.0/Microsoft.Maui.Core.HybridWebViewSourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net11.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net11.0/Microsoft.Maui.Maps.dll
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net11.0/Microsoft.Maui.Controls.Xaml.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net11.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /home/vsts/work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(24,6): error CS0117: 'Binding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(71,5): error CS0117: 'Binding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(76,38): error CS1061: 'Binding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'Binding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(77,43): error CS1061: 'TypedBinding<MockViewModel, string>' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'TypedBinding<MockViewModel, string>' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(94,40): error CS1061: 'Binding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'Binding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(95,45): error CS1061: 'TypedBinding<MockViewModel, string>' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'TypedBinding<MockViewModel, string>' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(117,13): error CS1061: 'TypedBinding<MockViewModel, string>' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'TypedBinding<MockViewModel, string>' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(563,5): error CS0117: 'MultiBinding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(595,5): error CS0117: 'MultiBinding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(615,5): error CS0117: 'MultiBinding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(620,31): error CS1061: 'MultiBinding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'MultiBinding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(639,61): error CS1061: 'MultiBinding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'MultiBinding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]

🟢 With fix — 🧪 BindingConverterCultureTests: PASS ✅ · 153s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net11.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net11.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net11.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net11.0/Microsoft.Maui.Maps.dll
  Core.HybridWebViewSourceGen -> /home/vsts/work/1/s/artifacts/bin/Core.HybridWebViewSourceGen/Debug/netstandard2.0/Microsoft.Maui.Core.HybridWebViewSourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net11.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net11.0/Microsoft.Maui.Controls.Xaml.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net11.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /home/vsts/work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /home/vsts/work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net11.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net11.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v11.0)
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 11.0.0-preview.6.26325.125)
[xUnit.net 00:00:00.27]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:04.08]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:04.12]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:04.39]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Passed TypedBindingConverterCultureOverridesCurrentUICulture [65 ms]
  Passed BindingConverterCultureOverridesCurrentUICulture [22 ms]
  Passed ClonesKeepUnsetConverterCultureDynamic [6 ms]
  Passed ClonesPreserveExplicitConverterCulture [< 1 ms]

Test Run Successful.
Total tests: 4
     Passed: 4
 Total time: 5.5596 Seconds

🔴 Without fix — 🧪 MultiBindingTests: 🛠️ BUILD ERROR · 36s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net11.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net11.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net11.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net11.0/Microsoft.Maui.Maps.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Core.HybridWebViewSourceGen -> /home/vsts/work/1/s/artifacts/bin/Core.HybridWebViewSourceGen/Debug/netstandard2.0/Microsoft.Maui.Core.HybridWebViewSourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net11.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net11.0/Microsoft.Maui.Controls.Maps.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net11.0/Microsoft.Maui.Controls.Xaml.dll
  TestUtils -> /home/vsts/work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(24,6): error CS0117: 'Binding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(71,5): error CS0117: 'Binding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(76,38): error CS1061: 'Binding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'Binding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(77,43): error CS1061: 'TypedBinding<MockViewModel, string>' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'TypedBinding<MockViewModel, string>' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(94,40): error CS1061: 'Binding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'Binding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(95,45): error CS1061: 'TypedBinding<MockViewModel, string>' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'TypedBinding<MockViewModel, string>' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(117,13): error CS1061: 'TypedBinding<MockViewModel, string>' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'TypedBinding<MockViewModel, string>' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(563,5): error CS0117: 'MultiBinding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(595,5): error CS0117: 'MultiBinding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(615,5): error CS0117: 'MultiBinding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(620,31): error CS1061: 'MultiBinding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'MultiBinding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/MultiBindingTests.cs(639,61): error CS1061: 'MultiBinding' does not contain a definition for 'ConverterCulture' and no accessible extension method 'ConverterCulture' accepting a first argument of type 'MultiBinding' could be found (are you missing a using directive or an assembly reference?) [/home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj]

🟢 With fix — 🧪 MultiBindingTests: PASS ✅ · 41s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net11.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net11.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net11.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net11.0/Microsoft.Maui.Maps.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Core.HybridWebViewSourceGen -> /home/vsts/work/1/s/artifacts/bin/Core.HybridWebViewSourceGen/Debug/netstandard2.0/Microsoft.Maui.Core.HybridWebViewSourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net11.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net11.0/Microsoft.Maui.Controls.Xaml.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net11.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /home/vsts/work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Controls.Core.UnitTests -> /home/vsts/work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net11.0/Microsoft.Maui.Controls.Core.UnitTests.dll
Test run for /home/vsts/work/1/s/artifacts/bin/Controls.Core.UnitTests/Debug/net11.0/Microsoft.Maui.Controls.Core.UnitTests.dll (.NETCoreApp,Version=v11.0)
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.01] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 11.0.0-preview.6.26325.125)
[xUnit.net 00:00:00.56]   Discovering: Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:06.43]   Discovered:  Microsoft.Maui.Controls.Core.UnitTests
[xUnit.net 00:00:06.49]   Starting:    Microsoft.Maui.Controls.Core.UnitTests
  Passed TestNestedMultiBindings [175 ms]
  Passed TestRelativeSources_TypedBinding [216 ms]
  Passed TestBindingModes [18 ms]
  Passed TestNestedMultiBindings_TypedBinding [15 ms]
  Passed TestChildOneWayOnMultiTwoWay [2 ms]
  Passed TestConverterWithStringFormat [7 ms]
  Passed TestRelativeSources [9 ms]
  Passed ClonePreservesDynamicDefaultConverterCulture [5 ms]
  Passed ClonePreservesExplicitConverterCulture [< 1 ms]
[xUnit.net 00:00:07.16]   Finished:    Microsoft.Maui.Controls.Core.UnitTests
  Passed TestStringFormat [3 ms]
  Passed ConverterCulturePassedToConvertBack [1 ms]
  Passed TestConverterReturnValues [5 ms]
  Passed TestMultiBindingContinuesUpdatingAfterConvertBack [5 ms]
  Passed ConverterCulturePassedToConvert [1 ms]

Test Run Successful.
Total tests: 14
     Passed: 14
 Total time: 8.5644 Seconds

🔴 Without fix — 📄 Maui5696: 🛠️ BUILD ERROR · 108s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net11.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net11.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net11.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Core.HybridWebViewSourceGen -> /home/vsts/work/1/s/artifacts/bin/Core.HybridWebViewSourceGen/Debug/netstandard2.0/Microsoft.Maui.Core.HybridWebViewSourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net11.0/Microsoft.Maui.Controls.dll
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net11.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net11.0/Microsoft.Maui.Controls.Xaml.dll
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net11.0/Microsoft.Maui.Controls.Maps.dll
  TestUtils -> /home/vsts/work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/netstandard2.0/Microsoft.Maui.Graphics.dll
  Controls.Xaml.UnitTests.ExternalAssembly -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml.UnitTests.ExternalAssembly/Debug/net11.0/Microsoft.Maui.Controls.Xaml.UnitTests.ExternalAssembly.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/netstandard2.0/Microsoft.Maui.Essentials.dll
  Controls.Xaml.UnitTests.InternalsVisibleAssembly -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml.UnitTests.InternalsVisibleAssembly/Debug/net11.0/Microsoft.Maui.Controls.Xaml.UnitTests.InternalsVisibleAssembly.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/netstandard2.0/Microsoft.Maui.dll
  Controls.Xaml.UnitTests.InternalsHiddenAssembly -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml.UnitTests.InternalsHiddenAssembly/Debug/net11.0/Microsoft.Maui.Controls.Xaml.UnitTests.InternalsHiddenAssembly.dll
  Maui25871Library -> /home/vsts/work/1/s/artifacts/bin/Maui25871Library/Debug/net11.0/Maui25871Library.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/netstandard2.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/netstandard2.0/Microsoft.Maui.Controls.Xaml.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.SourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.SourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.SourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Build.Tasks -> /home/vsts/work/1/s/artifacts/bin/Controls.Build.Tasks/Debug/netstandard2.0/Microsoft.Maui.Controls.Build.Tasks.dll
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Bz40906.xaml(6,4): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Gh2517.xaml(6,13): warning MAUIG2045: Binding: Property "MissingProperty" not found on "global::Microsoft.Maui.Controls.Label". The binding will use slower reflection-based binding at runtime. If this property is generated by another source generator, consider reporting this at https://github.com/dotnet/maui/issues to help us improve source generator interoperability. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui20616.xaml(12,7): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui20768.xaml(6,33): warning MAUIG2045: Binding: Property "Title" not found on "global::Microsoft.Maui.Controls.Xaml.UnitTests.ViewModel20768". The binding will use slower reflection-based binding at runtime. If this property is generated by another source generator, consider reporting this at https://github.com/dotnet/maui/issues to help us improve source generator interoperability. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui20818.xaml(18,7): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui25871.xaml(14,25): warning MAUIG2045: Binding: Property "UpdateProgress" not found on "global::Microsoft.Maui.Controls.Xaml.UnitTests.Maui25871ViewModel". The binding will use slower reflection-based binding at runtime. If this property is generated by another source generator, consider reporting this at https://github.com/dotnet/maui/issues to help us improve source generator interoperability. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui3059.xaml(8,5): error MAUIX2017: Property 'Border.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui5696.xaml(13,5): error MAUIX2002: No accessible property, BindableProperty, or event found for "ConverterCulture", or mismatching type between value and property. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Required.xaml(11,11): warning MAUIX2005: 'global::Microsoft.Maui.Controls.Xaml.UnitTests.RequiredRandomSelector.Template2' has the 'required' keyword. Support for this in XAML is limited at the moment, avoid using it. We're still doing a best effort to provide a value. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/TestSharedResourceDictionary.xaml(19,6): error MAUIX2017: Property 'ContentView.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]

🟢 With fix — 📄 Maui5696: 🛠️ BUILD ERROR · 109s
  Determining projects to restore...
  All projects are up-to-date for restore.
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/net11.0/Microsoft.Maui.Graphics.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/net11.0/Microsoft.Maui.Essentials.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/net11.0/Microsoft.Maui.dll
  Controls.BindingSourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.BindingSourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.BindingSourceGen.dll
  Core.HybridWebViewSourceGen -> /home/vsts/work/1/s/artifacts/bin/Core.HybridWebViewSourceGen/Debug/netstandard2.0/Microsoft.Maui.Core.HybridWebViewSourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Maps -> /home/vsts/work/1/s/artifacts/bin/Maps/Debug/net11.0/Microsoft.Maui.Maps.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/net11.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Maps -> /home/vsts/work/1/s/artifacts/bin/Controls.Maps/Debug/net11.0/Microsoft.Maui.Controls.Maps.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/net11.0/Microsoft.Maui.Controls.Xaml.dll
  TestUtils -> /home/vsts/work/1/s/artifacts/bin/TestUtils/Debug/netstandard2.0/Microsoft.Maui.TestUtils.dll
  Maui25871Library -> /home/vsts/work/1/s/artifacts/bin/Maui25871Library/Debug/net11.0/Maui25871Library.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Graphics -> /home/vsts/work/1/s/artifacts/bin/Graphics/Debug/netstandard2.0/Microsoft.Maui.Graphics.dll
  Controls.Xaml.UnitTests.InternalsHiddenAssembly -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml.UnitTests.InternalsHiddenAssembly/Debug/net11.0/Microsoft.Maui.Controls.Xaml.UnitTests.InternalsHiddenAssembly.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Essentials -> /home/vsts/work/1/s/artifacts/bin/Essentials/Debug/netstandard2.0/Microsoft.Maui.Essentials.dll
  Controls.Xaml.UnitTests.InternalsVisibleAssembly -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml.UnitTests.InternalsVisibleAssembly/Debug/net11.0/Microsoft.Maui.Controls.Xaml.UnitTests.InternalsVisibleAssembly.dll
  Controls.Xaml.UnitTests.ExternalAssembly -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml.UnitTests.ExternalAssembly/Debug/net11.0/Microsoft.Maui.Controls.Xaml.UnitTests.ExternalAssembly.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Core -> /home/vsts/work/1/s/artifacts/bin/Core/Debug/netstandard2.0/Microsoft.Maui.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Core -> /home/vsts/work/1/s/artifacts/bin/Controls.Core/Debug/netstandard2.0/Microsoft.Maui.Controls.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Xaml -> /home/vsts/work/1/s/artifacts/bin/Controls.Xaml/Debug/netstandard2.0/Microsoft.Maui.Controls.Xaml.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.SourceGen -> /home/vsts/work/1/s/artifacts/bin/Controls.SourceGen/Debug/netstandard2.0/Microsoft.Maui.Controls.SourceGen.dll
  ##vso[build.updatebuildnumber]11.0.0-ci+azdo.14541273
  Controls.Build.Tasks -> /home/vsts/work/1/s/artifacts/bin/Controls.Build.Tasks/Debug/netstandard2.0/Microsoft.Maui.Controls.Build.Tasks.dll
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Bz40906.xaml(6,4): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Gh2517.xaml(6,13): warning MAUIG2045: Binding: Property "MissingProperty" not found on "global::Microsoft.Maui.Controls.Label". The binding will use slower reflection-based binding at runtime. If this property is generated by another source generator, consider reporting this at https://github.com/dotnet/maui/issues to help us improve source generator interoperability. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui20616.xaml(12,7): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui20768.xaml(6,33): warning MAUIG2045: Binding: Property "Title" not found on "global::Microsoft.Maui.Controls.Xaml.UnitTests.ViewModel20768". The binding will use slower reflection-based binding at runtime. If this property is generated by another source generator, consider reporting this at https://github.com/dotnet/maui/issues to help us improve source generator interoperability. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui20818.xaml(18,7): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui25871.xaml(14,25): warning MAUIG2045: Binding: Property "UpdateProgress" not found on "global::Microsoft.Maui.Controls.Xaml.UnitTests.Maui25871ViewModel". The binding will use slower reflection-based binding at runtime. If this property is generated by another source generator, consider reporting this at https://github.com/dotnet/maui/issues to help us improve source generator interoperability. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Maui3059.xaml(8,5): error MAUIX2017: Property 'Border.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Required.xaml(11,11): warning MAUIX2005: 'global::Microsoft.Maui.Controls.Xaml.UnitTests.RequiredRandomSelector.Template2' has the 'required' keyword. Support for this in XAML is limited at the moment, avoid using it. We're still doing a best effort to provide a value. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]
/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/TestSharedResourceDictionary.xaml(19,6): error MAUIX2017: Property 'ContentView.Content' is being set multiple times. Only the last value will be used. [/home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj]

⚠️ Failure Details

  • 🛠️ BindingConverterCultureTests without fix: build failed before tests could run
    • /home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(24,6): error CS0117: 'Binding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Contr...
  • 🛠️ MultiBindingTests without fix: build failed before tests could run
    • /home/vsts/work/1/s/src/Controls/tests/Core.UnitTests/BindingConverterCultureTests.cs(24,6): error CS0117: 'Binding' does not contain a definition for 'ConverterCulture' [/home/vsts/work/1/s/src/Contr...
  • 🛠️ Maui5696 without fix: build failed before tests could run
    • /home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Bz40906.xaml(6,4): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vs...
  • 🛠️ Maui5696 with fix: build failed (fix does not compile)
    • /home/vsts/work/1/s/src/Controls/tests/Xaml.UnitTests/Issues/Bz40906.xaml(6,4): error MAUIX2017: Property 'ContentPage.Content' is being set multiple times. Only the last value will be used. [/home/vs...
📁 Fix files reverted (21 files)
  • src/Controls/src/Build.Tasks/SetPropertiesVisitor.cs
  • src/Controls/src/Core/Binding.cs
  • src/Controls/src/Core/MultiBinding.cs
  • src/Controls/src/Core/PublicAPI/net-android/PublicAPI.Unshipped.txt
  • src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt
  • src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt
  • src/Controls/src/Core/PublicAPI/net-tizen/PublicAPI.Unshipped.txt
  • src/Controls/src/Core/PublicAPI/net-windows/PublicAPI.Unshipped.txt
  • src/Controls/src/Core/PublicAPI/net/PublicAPI.Unshipped.txt
  • src/Controls/src/Core/PublicAPI/netstandard/PublicAPI.Unshipped.txt
  • src/Controls/src/Core/TypedBinding.cs
  • src/Controls/src/SourceGen/CompiledBindingMarkup.cs
  • src/Controls/src/SourceGen/KnownMarkups.cs
  • src/Controls/src/Xaml/MarkupExtensions/BindingExtension.cs
  • src/Controls/src/Xaml/PublicAPI/net-android/PublicAPI.Unshipped.txt
  • src/Controls/src/Xaml/PublicAPI/net-ios/PublicAPI.Unshipped.txt
  • src/Controls/src/Xaml/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt
  • src/Controls/src/Xaml/PublicAPI/net-tizen/PublicAPI.Unshipped.txt
  • src/Controls/src/Xaml/PublicAPI/net-windows/PublicAPI.Unshipped.txt
  • src/Controls/src/Xaml/PublicAPI/net/PublicAPI.Unshipped.txt
  • src/Controls/src/Xaml/PublicAPI/netstandard/PublicAPI.Unshipped.txt

🔗 Regression Cross-Reference

🔍 Regression Cross-Reference

Overlaps with prior bug-fix PRs — same files modified, but no exact line revert detected.

File Fix PR Fixed issue(s)
src/Controls/src/SourceGen/CompiledBindingMarkup.cs #32916 #13856
src/Controls/src/SourceGen/CompiledBindingMarkup.cs #33914
src/Controls/src/SourceGen/KnownMarkups.cs #34727 #34726
src/Controls/src/SourceGen/KnownMarkups.cs #34501 #34490

🧪 Regression Tests to Verify

These tests were added by the overlapping fix PRs. Running them to verify no side-effect regressions:

Fix PR Type Test Filter
#32916 UnitTest Maui13856Tests Maui13856Tests
#32916 XamlUnitTest Maui13856 Maui13856
#33914 XamlUnitTest Maui33826Project Maui33826Project
#34727 XamlUnitTest Maui34726 Maui34726
#34501 UnitTest BindingDiagnosticsTests BindingDiagnosticsTests
#34501 XamlUnitTest Maui34490ViewModel Maui34490ViewModel

🧪 Regression Test Results

FAILED — 2 passed, 4 failed, 0 skipped

Fix PR Test Type Result
#32916 Maui13856Tests UnitTest ✅ PASSED
#32916 Maui13856 XamlUnitTest ❌ FAILED
#33914 Maui33826Project XamlUnitTest ❌ FAILED
#34727 Maui34726 XamlUnitTest ❌ FAILED
#34501 BindingDiagnosticsTests UnitTest ✅ PASSED
#34501 Maui34490ViewModel XamlUnitTest ❌ FAILED

📋 Pre-Flight — Context & Validation

Issue: #5696 - Binding converter culture override
PR: #35821 - Add ConverterCulture support to Binding/XAML compiled binding paths
Platforms Affected: Android requested for testing; implementation is shared Controls/XAML/source-generator code affecting all platforms.
Files Changed: 21 implementation/API files, 4 test files

Key Findings

  • PR adds explicit ConverterCulture support for runtime Binding, TypedBindingBase, MultiBinding, XAML BindingExtension, XamlC, and source-generated compiled bindings.
  • GitHub CLI is unauthenticated in this environment, so remote PR body/comments/checks could not be fetched directly. Local squashed commit a1248454f1 was used for code context.
  • Gate result supplied by caller is inconclusive; this phase did not re-run gate verification.
  • There are unrelated dirty .github/scripts and skill files in the worktree; alternative attempts are isolated outside the main worktree.

Code Review Summary

Verdict: NEEDS_DISCUSSION
Confidence: low
Errors: 0 | Warnings: 1 | Suggestions: 1

Key code review findings:

  • ⚠ PR description appears stale if it still claims MultiBinding is not included; current code adds MultiBinding.ConverterCulture.
  • ℹ Consider XAML syntax coverage for MultiBinding.ConverterCulture; current local PR tests cover MultiBinding via unit tests.

Fix Candidates

# Source Approach Test Result Files Changed Notes
PR PR #35821 Add ConverterCulture properties to runtime binding types and thread the value through XAML/XamlC/sourcegen generated binding creation. ⚠ INCONCLUSIVE (Gate supplied by caller) Binding.cs, TypedBinding.cs, MultiBinding.cs, XAML/sourcegen/API/test files Original PR

🔬 Code Review — Deep Analysis

Code Review — PR #35821

Independent Assessment

What this changes: Adds ConverterCulture to Binding, TypedBindingBase, MultiBinding, XAML BindingExtension, XamlC, and source-gen binding paths. Explicit culture is passed to converter Convert/ConvertBack; unset culture remains dynamic via CurrentUICulture.

Inferred motivation: Fix #5696: allow locale override per binding.

Reconciliation with PR Narrative

Author claims: Adds Binding.ConverterCulture; says MultiBinding is intentionally not included.
Agreement/disagreement: Code now adds MultiBinding.ConverterCulture, so the PR description is stale.

Prior Review Reconciliation

Prior ❌ Error Finding Source Status Evidence
Source-gen per-binding CultureInfoConverter allocation inline review ✅ Fixed KnownMarkups.cs emits CultureInfo.GetCultureInfo(...).
Gate/build inconclusive due XAML MAUIX2017 diagnostics MauiBot ❌ Unresolved/External Current MauiBot review still reports XAML test verification blocked by unrelated existing files.

Blast Radius Assessment

  • Runs for all instances: mostly no; behavior changes only when converters/ConverterCulture are used, though XamlC emits an extra null setter for compiled bindings.
  • Startup impact: no direct startup/static initialization impact.
  • Static/shared state: no new static state.

CI Status

  • Required-check result: gh pr checks --required unavailable (unauthenticated). Public check-runs show maui-pr and Build Analysis failing.
  • Classification: undetermined / likely unrelated but not proven. Failing leaf is AOT macOS integration tests with unexpected linker-cache/apply-preserve-attribute.xml, not binding-specific.
  • Action taken: invoked azdo-build-investigator; ci-analysis unavailable. Confidence capped low; no LGTM.

Findings

⚠️ Warning — PR description is stale

The PR body says MultiBinding is not included, but the current diff adds MultiBinding.ConverterCulture and public API entries. Update the description before merge.

💡 Suggestion — Add XAML MultiBinding.ConverterCulture coverage

MultiBinding has unit coverage, but no XAML syntax test for setting ConverterCulture on MultiBinding.

Failure-Mode Probing

  • Unset culture: remains dynamic (_converterCulture ?? CurrentUICulture), clone preserves raw null field.
  • Explicit null: reverts to dynamic default; consistent with property shape.
  • Compiled binding without culture: gets a harmless null assignment, then runtime fallback remains unchanged.

Verdict: NEEDS_DISCUSSION

Confidence: low
Summary: Code implementation appears sound, but CI is red/undetermined and prior gate verification remains inconclusive. Also update the stale PR narrative around MultiBinding.


🛠️ Fix — Analysis & Comparison

Fix Candidates

# Source Approach Test Result Files Changed Notes
1 maui-expert-reviewer Shared internal BindingBase converter-culture slot with public facades on Binding, TypedBindingBase, and MultiBinding; clones copy the raw nullable slot through one helper. ⚠ Blocked 4 files Core culture unit tests passed (18/18). XAML primary build blocked by existing MAUIX2017 duplicate-content diagnostics after build-task recovery; mandatory regressions not run because primary XAML did not pass.
2 maui-expert-reviewer Culture-bound IValueConverter/IMultiValueConverter wrappers that substitute explicit culture while leaving converter call sites on CurrentUICulture. ⚠ Blocked 4 files + 1 new helper Core culture unit tests passed (18/18) after one compile fix. XAML/regression validation blocked by build-task/environment prerequisites. Self-review found wrapper identity/complexity risk.
PR PR #35821 Separate ConverterCulture fields/properties on Binding, TypedBindingBase, and MultiBinding; direct converter call-site use; XAML/XamlC/sourcegen assignment plumbing. ⚠ INCONCLUSIVE (Gate supplied by caller) 25 files Original PR. Code review found no functional errors; PR narrative may be stale around MultiBinding.

Cross-Pollination

Model Round New Ideas? Details
gpt-5.5 / maui-expert-reviewer 2 No No third meaningfully different approach recommended. Remaining ideas were public BindingBase.ConverterCulture (overexposes API), side-car storage (overhead/complexity), fallback to runtime binding (loses compiled-binding benefits), or helper/interface reshuffles equivalent to the PR.

Exhausted: Yes
Selected Fix: PR #35821 — The PR's direct per-binding storage and converter call-site plumbing remains the clearest low-risk implementation. Candidate 1 is a plausible refactor but not demonstrably better because full XAML/regression validation was blocked; Candidate 2 is more complex and has compatibility risk.


📝 Recommended PR Title & Description

Assessment: ✏️ Recommend updating — the current description is stale because it says MultiBinding is intentionally excluded, but the actual diff adds MultiBinding.ConverterCulture support.

Recommended title

Binding: Add ConverterCulture support

Recommended description

### Description

Adds `Binding.ConverterCulture` support for #5696 so bindings can pass an explicit `CultureInfo` to `IValueConverter.Convert` and `ConvertBack` instead of always using `CultureInfo.CurrentUICulture`.

The implementation preserves existing `Binding` constructor signatures and wires the property through runtime bindings, typed bindings, runtime XAML, XamlC, and source-generated XAML. It also adds `MultiBinding.ConverterCulture` so `IMultiValueConverter.Convert` and `ConvertBack` receive the explicit culture when one is set.

Unset `ConverterCulture` remains dynamic: bindings continue to use the current `CultureInfo.CurrentUICulture` unless an explicit culture is assigned. Clone paths preserve explicit cultures without snapshotting the default culture.

This intentionally does not add new `ConverterCulture` APIs to `TemplateBinding`. `TemplateBinding` has no `ConverterCulture` property to propagate.

### Issues Fixed

Fixes #5696

### Testing

- `git diff --check`
- `dotnet build src/Controls/src/Build.Tasks/Controls.Build.Tasks.csproj --no-restore`
- `dotnet build src/Controls/src/SourceGen/Controls.SourceGen.csproj --no-restore`
- `dotnet test src/Controls/tests/BindingSourceGen.UnitTests/Controls.BindingSourceGen.UnitTests.csproj --no-restore`
- `dotnet test src/Controls/tests/SourceGen.UnitTests/SourceGen.UnitTests.csproj --no-restore`
- `LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 dotnet test src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj --no-restore`
- `LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 dotnet test src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj --no-restore -p:WarningsNotAsErrors=XC0618%3BXC0619%3BXC0022%3BXC0023%3BXC0025%3BXC0045%3BXC0067%3BMAUIG2045%3BMAUID1000%3BMAUIX2005%3BMAUIX2015%3BMAUIX2017`

🏁 Report — Final Recommendation

Comparative Candidate Report

Candidates Compared

Rank Candidate Result Assessment
1 pr ⚠ Inconclusive validation Best candidate. The direct per-binding ConverterCulture implementation is straightforward, preserves unset-culture dynamism, covers runtime/XAML/XamlC/sourcegen paths, and expert review found no actionable code issues.
2 pr-plus-reviewer ⚠ Inconclusive validation Functionally identical to pr because the expert reviewer produced no actionable findings. Ranked below pr only because it adds no improvement over the submitted fix.
3 try-fix-1 ⚠ Blocked A reasonable refactor that centralizes converter-culture storage in BindingBase while keeping public facades on derived binding types. Core culture tests passed, but XAML/regression validation was blocked, and the refactor is not demonstrably better than the smaller submitted PR approach.
4 try-fix-2 ⚠ Blocked Core culture tests passed after a compile fix, but the wrapper-converter design is more complex and carries a moderate compatibility risk because internal converter storage no longer directly holds the user converter instance.

No candidate has a fully passing regression result. The supplied gate is inconclusive and the XAML regression failures in the phase artifacts are not treated as PR-caused code failures because the environment could not reliably build/run the relevant XAML tests. If any candidate had passed the regression tests, it would rank above candidates with failing regression tests per the required ordering rule.

Candidate Details

pr

The submitted PR adds ConverterCulture to Binding, TypedBindingBase, MultiBinding, and BindingExtension, then wires that value through runtime binding, typed binding, XamlC, and source-generated XAML. This is the clearest implementation because converter call sites pass the selected culture directly and no wrapper/side-channel behavior is introduced.

pr-plus-reviewer

The expert reviewer wrote an empty inline findings file ([]) and recommended no patch-level changes. This candidate is therefore identical to pr.

try-fix-1

This candidate centralizes the nullable converter-culture slot in BindingBase and exposes derived public facades. It reduces duplicated backing-field/clone code, but it touches an additional base type and did not complete XAML/regression validation. Since the PR's duplicated state is small and explicit, this refactor is not enough to displace the submitted implementation.

try-fix-2

This candidate wraps converters with culture-bound decorators so existing converter call sites continue to pass CurrentUICulture. The approach is meaningfully different but less desirable: it adds wrapper allocation/identity complexity and had a compile issue during iteration before core tests passed.

Winner

pr is the winning candidate.

The submitted fix is the lowest-risk complete implementation: it is direct, readable, and covers the required runtime and generated binding surfaces. The expert-review-enhanced candidate produced no changes, try-fix-1 is only a refactor without stronger validation, and try-fix-2 is more complex with a compatibility concern.


🧭 Next Steps — review latest findings

No alternative fix was selected for this run. Review the session findings and CI results before merging.

@MauiBot MauiBot removed the s/agent-review-in-progress AI review is currently running for this PR label Jul 1, 2026
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 1, 2026
@github-actions github-actions Bot added this to the .NET 11.0-preview7 milestone Aug 12, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-xaml XAML, CSS, Triggers, Behaviors s/agent-fix-pr-picked AI could not beat the PR fix - PR is the best among all candidates s/agent-reviewed PR was reviewed by AI agent workflow (full 4-phase review) t/breaking 💥

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants