Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Nov 28, 2025

GitHub Issue (If applicable): closes #2912

PR Type

What kind of change does this PR introduce?

  • Bugfix

What is the current behavior?

Re-adding a Button Command binding via Hot Reload breaks TabBar navigation. After Hot Reload, tapping a tab does nothing because the region becomes orphaned:

  1. ReassignParent() unconditionally sets Parent = null
  2. AssignParent() may return early if View.GetAttached() is false during Hot Reload timing
  3. Region left with Parent = null, _services = null
  4. Region.Navigator() returns null, navigation fails

What is the new behavior?

ReassignParent() now preserves parent relationship when reassignment would fail:

  • Precondition check: Returns early if View is null, is root, or not attached
  • Find-before-clear: Locates new parent before modifying current state
  • Preserve existing: Keeps current parent if no new parent found (prevents orphaning)
  • Atomic update: Sets parent and name together when new parent exists
// Before: unconditionally orphans, then tries to recover
Parent = null;
AssignParent();

// After: only changes parent when safe
var newParent = View.FindParentRegion(out var routeName);
if (newParent is null && Parent is not null)
    return; // Keep existing parent
if (newParent is not null)
{
    Parent = newParent;
    Name = routeName;
}

PR Checklist

Please check if your PR fulfills the following requirements:

  • Tested code with current supported SDKs
  • Docs have been added/updated which fit documentation template. (for bug fixes / features)
  • Unit Tests and/or UI Tests for the changes have been added (for bug fixes / features) (if applicable)
  • Wasm UI Tests are not showing unexpected any differences. Validate PR Screenshots Compare Test Run results.
  • Contains NO breaking changes
  • Updated the Release Notes
  • Associated with an issue (GitHub or internal)

Other information

Hot Design works because it preserves element identity during updates. Hot Reload may trigger AttachedChangedReassignParent() with timing where GetAttached() temporarily returns false.

Internal Issue (If applicable):

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • 1oavsblobprodcus350.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/D85692722C87C5CC860C8C97E3964764/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 1s1vsblobprodcus386.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/AD7B40D2B820D8223D4C38D430808EF7/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 2kmvsblobprodcus39.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/70593C6D7716240F283A24747D312FA1/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 4myvsblobprodcus32.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/70593C6D7716240F283A24747D312FA1/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • 4vyvsblobprodcus361.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug -p:TargetFrameworks=net9.0 (dns block)
  • 5rqvsblobprodcus385.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/uno.extensions/testing/TestHarness/TestHarness.UITest/TestHarness.UITest.csproj --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/packages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal /p:TargetFrameworkRootPath=/home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot /p:NetCoreTargetingPackRoot=/home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/emptyFakeDotnetRoot (dns block)
  • 96bvsblobprodcus338.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/70593C6D7716240F283A24747D312FA1/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • bcnvsblobprodcus378.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/D8EF513EFABB6C5875B94F0C1638D262/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • cflvsblobprodcus383.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug -p:TargetFrameworks=net9.0 (dns block)
  • crl.godaddy.com
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/08DFEECC4C1FD333FFD63C17C7081C67/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • dlbvsblobprodcus316.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/E7B5E0C97290FB53C2DCA420CF493E2A/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • e7bvsblobprodcus348.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/70593C6D7716240F283A24747D312FA1/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ibzvsblobprodcus369.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/8678811784E46132669587676937D2EF/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • josvsblobprodcus372.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/E7B5E0C97290FB53C2DCA420CF493E2A/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • k0ivsblobprodcus356.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/E8B33609F82B4D2DB59C009A9FC7A4C1/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • k4kvsblobprodcus344.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/070F606598054205578256E76ACC5529/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/E7B5E0C97290FB53C2DCA420CF493E2A/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/7C413E517467CDB6A87A0AA3E5D24D5A/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • kijvsblobprodcus387.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug -p:TargetFrameworks=net9.0 (dns block)
  • kxqvsblobprodcus376.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/3E43B564B11FCDD81EAA8FFD9A21ABF0/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • lylvsblobprodcus31.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug -p:TargetFrameworks=net9.0 (dns block)
  • mfjvsblobprodcus373.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug -p:TargetFrameworks=net9.0 (dns block)
  • n3kvsblobprodcus335.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore (dns block)
  • o3svsblobprodcus318.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/676B829A743028324DDBB6E76201DE96/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ocsp.godaddy.com
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/08DFEECC4C1FD333FFD63C17C7081C67/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • pdfvsblobprodcus380.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/23402928C2CB7C876A271090935211E5/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • se1vsblobprodcus349.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/2F791F74279429A4411827997DA8D4D6/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • uy6vsblobprodcus34.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/70593C6D7716240F283A24747D312FA1/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • x3yvsblobprodcus370.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug -p:TargetFrameworks=net9.0 (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/8678811784E46132669587676937D2EF/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
    • Triggering command: /usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/2718D9FA22CF88B44DA542DEDD70FC6A/missingpackages_workingdir --packages /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.extensions/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force (dns block)
  • ytvvsblobprodcus310.blob.core.windows.net
    • Triggering command: /usr/bin/dotnet dotnet build --configuration Debug -p:TargetFrameworks=net9.0 (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

This section details on the original issue you should resolve

<issue_title>[HR][Gaps][Navigation/MVUX] Re-adding Button Command binding breaks Tabbar navigation</issue_title>
<issue_description><!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!

If the matter is security related, please disclose it privately via https://github.com/nventive/Uno/security/
-->

Current behavior

  • Re-adding a command binding via Hot Reload breaks Shell/TabBar tab switching (can’t return to previous tab). Affects any app using TabBar/NavigationView to drive regions;

  • Doing the same using HD works.

Untitled.video.-.Made.with.Clipchamp.mp4

Expected behavior

How to reproduce it (as minimally and precisely as possible)

Repro using the Chefs app: (https://github.com/unoplatform/uno.chefs/blob/f8c5943efa4eb702a066d09c6e3ef389ade3b973/Chefs/Views/HomePage.xaml#L99)

  1. On HomePage, remove Command="{Binding ShowAll}" from the “View all” button; run.

  2. Re-add the command and apply Hot Reload.

  3. Tap View all → navigates to /Main/-/Search.

  4. Tap Home tab.

  5. Home tab does nothing (stays on Search). Doing the same flow with Hot Design works.

Environment

Nuget Package (s):

Package Version(s):

Affected platform(s):

  • iOS
  • macOS (AppKit)
  • Mac Catalyst
  • Android
  • WebAssembly
  • Windows
  • Skia (WPF)
  • Skia (GTK on Linux/macOS/Windows)
  • Skia (Linux Framebuffer)
  • Build tasks

Visual Studio:

  • 2019 (version: )
  • 2022 (version: )
  • Visual Studio Code (version: )
  • Rider Windows (version: )
  • Rider macOS (version: )

Relevant plugins:

  • Resharper (version: )

Anything else we need to know?

</issue_description>

Comments on the Issue (you are @copilot in this section)


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@CLAassistant
Copy link

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

Copilot AI changed the title [WIP] Fix button command binding to restore TabBar navigation fix: Prevent region orphaning during Hot Reload in ReassignParent Nov 28, 2025
Copilot AI requested a review from kazo0 November 28, 2025 04:03
Copilot finished work on behalf of kazo0 November 28, 2025 04:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[HR][Gaps][Navigation/MVUX] Re-adding Button Command binding breaks Tabbar navigation

3 participants