Experimental interface IBehavior#32350
Conversation
|
Hey there @@stephenquan! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
There was a problem hiding this comment.
Pull Request Overview
This PR introduces an experimental IBehavior interface in .NET MAUI to enable behaviors to be assigned to any object, not just those constrained by the concrete Behavior class. The change allows behaviors to inherit from VisualElement while implementing IBehavior, potentially enabling DynamicResource functionality through access to the ResourceDictionary.
Key Changes:
- Introduces public
IBehaviorandIBehavior<T>interfaces - Makes
IAttachedObjectinterface public (previously internal) - Updates
VisualElement.Behaviorsproperty type fromIList<Behavior>toIList<IBehavior>
Reviewed Changes
Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Controls/src/Core/VisualElement/VisualElement.cs | Changed Behaviors property type from IList<Behavior> to IList<IBehavior> |
| src/Controls/src/Core/Interactivity/IBehavior.cs | Added new IBehavior and IBehavior<T> interfaces |
| src/Controls/src/Core/Interactivity/IAttachedObject.cs | Changed IAttachedObject visibility from internal to public |
| src/Controls/src/Core/Interactivity/Behavior.cs | Updated Behavior and Behavior<T> to implement IBehavior and IBehavior<T> respectively |
| src/Controls/src/Core/PublicAPI/*/PublicAPI.Shipped.txt | Updated public API surface to reflect new interfaces and changed signatures |
91f0884 to
7a3ed80
Compare
|
/azp run |
|
Azure Pipelines successfully started running 3 pipeline(s). |
|
The last automated tests had 133 successful checks, but 30 failing tests. When I checked some of the failed test logs such as https://dev.azure.com/xamarin/public/_build/results?buildId=153239&view=logs&j=ac32be84-f58b-5440-705b-7d86d454906c&t=547eb81a-2da0-5d4e-f32b-53e5cde9624a it reports:
The failed tests aren't specific to the PR but a problem with the test itself. |
There was a problem hiding this comment.
The test GenericsIssue test is failing in Runtime, SourceGen and XamlC.
System.Reflection.TargetException : Object type System.Collections.Generic.ICollection1[Microsoft.Maui.Controls.IBehavior] does not match target type Microsoft.Maui.Controls.AttachedCollection1[Microsoft.Maui.Controls.Behavior].
Could you review it?
|
/azp run |
|
Commenter does not have sufficient privileges for PR 32350 in repo dotnet/maui |
|
I pushed a new commit af3d837 (above) addressing the test |
🤖 AI Summary📊 Expand Full Review —
|
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| PR | PR #32350 | Introduce public IBehavior / IBehavior<T>, make IAttachedObject public, and widen VisualElement.Behaviors to IList<IBehavior> |
⏳ PENDING (Gate) | src/Controls/src/Core/Interactivity/AttachedCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/IBehavior.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Shipped.txt |
Original PR; no new tests in diff |
🚦 Gate — Test Verification
Gate Result: ⚠️ SKIPPED
Platform: android
Mode: Full Verification
- Tests FAIL without fix: N/A
- Tests PASS with fix: N/A
Reason: PR #32350 does not add or modify test files under TestCases.HostApp, TestCases.Shared.Tests, or other test projects in the diff, so the gate phase is skipped per skill instructions.
🔧 Fix — Analysis & Comparison
Fix Candidates
| # | Source | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|
| 1 | try-fix (claude-opus-4.6) |
Introduce public IBehavior / IBehavior<T> and public IAttachedObject, but keep VisualElement.Behaviors and its backing collection typed as Behavior instead of widening to IBehavior |
✅ PASS | src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Unshipped.txt |
Smallest passing fix, but it gives up the PR’s intended IList<IBehavior> public shape |
| 2 | try-fix (claude-sonnet-4.6) |
Add a BehaviorCollection : AttachedCollection<Behavior>, IList<IBehavior> bridge so the public property can be IList<IBehavior> while the concrete collection stays Behavior-compatible for existing reflection/XAML code paths |
✅ PASS | src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/BehaviorCollection.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Unshipped.txt |
Preserves the intended public API shape with a compatibility shim |
| 3 | try-fix (gpt-5.3-codex) |
Add a dedicated BehaviorAttachedCollection : ObservableCollection<IBehavior>, IAttachedObject and point VisualElement.Behaviors at it, leaving generic AttachedCollection<T> unchanged |
❌ FAIL | src/Controls/src/Core/Interactivity/AttachedCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/VisualElement/VisualElement.cs |
Initial validation blocked by PublicAPI analyzer issues |
| 4 | try-fix (gemini-3-pro-preview) |
Add a dedicated BehaviorCollection : ObservableCollection<IBehavior>, IAttachedObject and move VisualElement.Behaviors to it, isolating behavior semantics from generic AttachedCollection<T> |
✅ PASS | src/Controls/src/Core/Interactivity/BehaviorCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/**/*.txt |
Works, but touches more code than needed |
| 5 | try-fix (gpt-5.3-codex, cross-pollination) |
Use a plain ObservableCollection<IBehavior> backing store and handle attach/detach directly in VisualElement via CollectionChanged |
✅ PASS | src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs |
Avoids custom collection types, but shifts more lifecycle logic into VisualElement |
| 6 | try-fix (claude-opus-4.6, cross-pollination) |
Keep the widened IList<IBehavior> API, but fix the XAML reflection path by resolving Add from the concrete runtime collection type in ApplyPropertiesVisitor |
✅ PASS | src/Controls/src/Xaml/ApplyPropertiesVisitor.cs |
Best balance: preserves PR intent, fixes regression in one file, and passes GenericsIssue + BehaviorTest |
| PR | PR #32350 | Introduce public IBehavior / IBehavior<T>, make IAttachedObject public, and widen VisualElement.Behaviors + backing collection to IBehavior |
src/Controls/src/Core/Interactivity/AttachedCollection.cs, src/Controls/src/Core/Interactivity/Behavior.cs, src/Controls/src/Core/Interactivity/IAttachedObject.cs, src/Controls/src/Core/Interactivity/IBehavior.cs, src/Controls/src/Core/VisualElement/VisualElement.cs, src/Controls/src/Core/PublicAPI/*/PublicAPI.Shipped.txt |
Review history reported a generic/XAML reflection regression |
Cross-Pollination
| Model | Round | New Ideas? | Details |
|---|---|---|---|
| claude-opus-4.6 | 1 | Yes | Keep the public interface introduction but preserve the concrete Behavior collection type to avoid invariance/reflection issues. |
| claude-sonnet-4.6 | 1 | Yes | Introduce a bridge collection that implements IList<IBehavior> but remains AttachedCollection<Behavior>-compatible for existing XAML reflection paths. |
| gpt-5.3-codex | 1 | Yes | Add a separate IBehavior-native attached collection instead of widening the generic collection or keeping the old property shape. |
| gemini-3-pro-preview | 1 | Yes | Replace the backing collection with a dedicated ObservableCollection<IBehavior> implementation specialized for behavior attach/detach semantics. |
| claude-opus-4.6 | 2 | Yes | Keep the widened API and fix the XAML add-path to resolve Add from the concrete runtime collection type. |
| claude-sonnet-4.6 | 2 | No | NO NEW IDEAS beyond the candidate set. |
| gpt-5.3-codex | 2 | Yes | Use a plain ObservableCollection<IBehavior> and wire attach/detach in VisualElement instead of any attached collection type. |
| gemini-3-pro-preview | 2 | No | NO NEW IDEAS beyond the candidate set. |
| claude-opus-4.6 | 3 | No | NO NEW IDEAS: remaining differences collapse into XAML/compiler changes or repackage candidate 6. |
| claude-sonnet-4.6 | 3 | Yes | Theoretical collection-boundary metadata/reflection hack, judged higher-risk and less direct than candidate 6. |
| gpt-5.3-codex | 3 | No | NO NEW IDEAS: practical solution space exhausted. |
| gemini-3-pro-preview | 3 | Yes | Theoretical BehaviorWrapper adapter idea, judged inferior to existing passing candidates. |
Exhausted: Yes (max 3 cross-pollination rounds reached)
Selected Fix: Candidate #6 — preserves the PR’s intended public API while fixing the XAML reflection regression with the smallest validated change.
📋 Report — Final Recommendation
⚠️ Final Recommendation: REQUEST CHANGES
Phase Status
| Phase | Status | Notes |
|---|---|---|
| Pre-Flight | ✅ COMPLETE | PR #32350 is an experimental breaking API change for Controls/XAML behavior APIs with no test files in the diff. |
| Gate | User requested Android, but the PR adds no test changes; the relevant regression surface is existing shared XAML/core tests rather than Android UI tests. | |
| Try-Fix | ✅ COMPLETE | 6 attempts total, 5 passing candidates, 3 cross-pollination rounds completed. |
| Report | ✅ COMPLETE |
Summary
PR #32350 aims to expose IBehavior publicly and widen VisualElement.Behaviors to IList<IBehavior>, but review history already surfaced a regression in the existing GenericsIssue XAML test. The mandatory try-fix phase found multiple passing alternatives, including one especially strong candidate that preserves the PR's intended public API while fixing the regression with a single XAML-layer change.
Because a better validated alternative exists, this PR should not be approved in its current form. The best alternative is Candidate #6 from try-fix/content.md: keep the widened IList<IBehavior> API, but update src/Controls/src/Xaml/ApplyPropertiesVisitor.cs so it resolves Add from the concrete runtime collection type rather than the declared interface type.
Root Cause
The regression comes from generic invariance plus reflection method resolution. After widening the property to IList<IBehavior>, XAML collection-item insertion can end up binding to ICollection<IBehavior>.Add, while the concrete runtime object still follows Behavior-oriented collection semantics. That mismatch is what produces the TargetException reported in review discussion for GenericsIssue.
Fix Quality
The current PR changes the public API and the backing collection shape, but it does not appear to address the XAML reflection compatibility issue directly. In contrast, Candidate #6 fixes the actual failing insertion path in one file, preserves the PR's intended public surface, and was empirically validated against:
dotnet test src/Controls/tests/Xaml.UnitTests/Controls.Xaml.UnitTests.csproj --filter GenericsIssue --no-restoredotnet test src/Controls/tests/Core.UnitTests/Controls.Core.UnitTests.csproj --filter BehaviorTest --no-restore
Compared with the other passing candidates, Candidate #6 is the simplest change that still honors the PR's design intent. Candidate #1 is smaller but abandons the intended IList<IBehavior> API. Candidates #2, #4, and #5 work, but they introduce extra collection types or lifecycle wiring that are heavier than necessary.
❌ Deep UI tests — 1023 passed, 27 failed across 11 categories on platform-pool agent (replaces in-process counts above).
🧪 UI Test Execution Results (deep, platform pool)
| Category | Tests | Snapshot diffs |
|---|---|---|
Border |
47/47 ✓ | — |
Brush |
41/41 ✓ | — |
Button |
66/68 ✓ | — |
CheckBox |
23/23 ✓ | — |
CollectionView |
591/618 (27 ❌) | 2 diff PNGs |
DatePicker |
43/43 ✓ | — |
Essentials |
— | — |
FlyoutPage |
61/61 ✓ | — |
Gestures |
56/56 ✓ | — |
Image |
43/45 ✓ | — |
ImageButton |
52/52 ✓ | — |
❌ CollectionView — 27 failed tests
VerifyGroupIndexScrollToByIndexWithStartPositionAndVerticalList_Carrot
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithStartPositionAndVerticalList_Carrot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1838
at System.Runtim
...
VerifyGroupIndexScrollToByIndexWithCenterPositionAndVerticalList_Potato
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithCenterPositionAndVerticalList_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1874
at System.Refle
...
VisitAndUpdateItemsSource("Observable Collection","Add/RemoveItemsGrid",19,6)
The app was expected to be running still, investigate as possible crash
TearDown : The app was expected to be running still, investigate as possible crash
at UITest.Appium.NUnit.UITestBase.UITestBaseTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 159
at UITest.Appium.NUnit.UITestBase.TestTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 45
at InvokeStub_UITestBase.TestTearDown(Object, Object, IntPtr*)
--TearDown
at UITest.Appium.NUnit.UITestBase.UITestBaseTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 159
at UITest.Appium.NUnit.UITestBase.TestTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 45
at InvokeStub_UITestBase.TestTearDown(Object, Object, IntPtr*)
1) at UITest.Appium.NUnit.UITestBase.UITestBaseTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 159
at UITest.Appium.NUnit.UITestBase.TestTearDown() in /_/src/TestUtils/src/UITest.NUnit/UITestBase.cs:line 45
at InvokeS
...
VerifyGroupItemScrollToByIndexWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3345
at System.Runtime
...
VerifyGroupItemScrollToByItemWithCenterPositionAndVerticalList_Potato
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByItemWithCenterPositionAndVerticalList_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2007
at System.Runtime
...
VerifyScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2137
at System.RuntimeMet
...
VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2810
at System.
...
VerifyGroupItemScrollToByItemWithStartPositionAndVerticalList_Carrot
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByItemWithStartPositionAndVerticalList_Carrot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1974
at System.RuntimeM
...
VerifyScrollToByItemWithCenterPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithCenterPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2628
at System.RuntimeMethodHan
...
VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndVerticalList_Apricot
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithMakeVisiblePositionAndVerticalList_Apricot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1802
at System
...
VerifyScrollToByItemWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2458
at System.RuntimeMeth
...
VerifyRemainingItemsThresholdReachedWithHorizontalList
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyRemainingItemsThresholdReachedWithHorizontalList() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3652
at System.RuntimeMethodHandle.In
...
VerifyGroupIndexScrollToByIndexWithCenterPositionAndHorizontalList_Tomato
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithCenterPositionAndHorizontalList_Tomato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3026
at System.Ref
...
VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3561
at System.RuntimeMe
...
VerifyGroupItemScrollToByItemWithMakeVisiblePositionAndVerticalList_Apricot
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByItemWithMakeVisiblePositionAndVerticalList_Apricot() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 1943
at System.R
...
VerifyFlowDirectionRTLAndMeasureAllItemsWithObservableCollection
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyFlowDirectionRTLAndMeasureAllItemsWithObservableCollection() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 77
at System.Reflection.Met
...
VerifyFlowDirectionLTRWithHeaderTemplateAndFooterTemplateAndHorizontalList
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_SelectionFeatureTests.VerifyFlowDirectionLTRWithHeaderTemplateAndFooterTemplateAndHorizontalList() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_SelectionFeatureTests.cs:line 1113
at System.Ru
...
VerifyScrollToByIndexWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2376
at System.RuntimeMethodHandl
...
VerifyScrollToByItemWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2541
at System.RuntimeMethodHand
...
VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalGrid_Potato
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalGrid_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3170
at System.Reflec
...
VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3134
at System.RuntimeM
...
VerifyGroupItemScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithMakeVisiblePositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3241
at System.R
...
VerifyGroupIndexScrollToByIndexWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupIndexScrollToByIndexWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2918
at System.Runtim
...
VerifyScrollToByIndexWithCenterPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithCenterPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2295
at System.RuntimeMethodHa
...
VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalGrid_Potato
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyGroupItemScrollToByIndexWithEndPositionAndHorizontalGrid_Potato() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 3597
at System.Runtime
...
VerifyScrollToByItemWithEndPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByItemWithEndPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2715
at System.RuntimeMethodHandle
...
VerifyScrollToByIndexWithStartPositionAndHorizontalList_Kiwi
System.TimeoutException : Timed out waiting for element...
at UITest.Appium.HelperExtensions.Wait(Func`1 query, Func`2 satisfactory, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2757
at UITest.Appium.HelperExtensions.WaitForAtLeastOne(Func`1 query, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 2784
at UITest.Appium.HelperExtensions.WaitForElement(IApp app, String marked, String timeoutMessage, Nullable`1 timeout, Nullable`1 retryFrequency, Nullable`1 postTimeout) in /_/src/TestUtils/src/UITest.Appium/HelperExtensions.cs:line 793
at Microsoft.Maui.TestCases.Tests.CollectionView_ScrollingFeatureTests.VerifyScrollToByIndexWithStartPositionAndHorizontalList_Kiwi() in /_/src/Controls/tests/TestCases.Shared.Tests/Tests/FeatureMatrix/CollectionView_ScrollingFeatureTests.cs:line 2214
at System.RuntimeMethodHan
...
📎 Download drop-deep-uitests artifact (TRX + snapshot diffs)
|
It should target net11, but do we want it @jfversluis? |
|
/review -b feature/refactor-copilot-yml |
AI code review for net11.0 targetAutomated, non-approval review comment. This does not constitute a human approval and intentionally does not use GitHub's Approve/Request-changes. Verdict: Needs discussion What this PR doesIntroduces public Findings
No blocking correctness defects in the implementation itself — the concern is API design/compat, which is exactly what the author flagged for discussion. CI noteOnly Confidence: High that this is a deliberate breaking/experimental change requiring design sign-off rather than a code-quality issue. |
kubaflo
left a comment
There was a problem hiding this comment.
PR #32350 — Experimental interface IBehavior
Verdict: NEEDS_DISCUSSION (confidence: high)
This is an author-acknowledged, explicitly experimental ("for continued discussion only") breaking public-API change — VisualElement.Behaviors goes from IList<Behavior> to IList<IBehavior> and IAttachedObject is promoted internal→public. It needs API-council/design sign-off and correctly targets the net11.0 major branch, so the central question is a design decision, not a fixable code defect.
Why the models split (2 ND / 2 NC): The two NC votes rest on weaker grounds when checked against the code. Gemini's NC asks to "revert the breaking change / defer to a major release" — but the breaking change is intentional, acknowledged, and already targeted at net11.0 (a major release), so its objection restates the PR's own premise. opus46's NC is a real but latent issue (see below). The two ND votes (gpt-5.5, opus-4.8) align with the PR's disclaimer and the prior copilot-cli-net11-fleet-review, which already landed on "Needs discussion."
Key findings (validated against HEAD af3d837)
- [inline · warning] net-tizen PublicAPI.Shipped.txt is incomplete (from opus-4.6). Confirmed: net-tizen only rewrites the
Behaviors.getline (HEAD line 1597) to referenceIBehaviorbut omits the 5 declarations added to all 6 other TFMs (IAttachedObject,IBehavior,~IBehavior<T>,AttachTo,DetachFrom). RS0016 would fire — but latent: Tizen is disabled in CI (IncludeTizenTargetFrameworks=falseinDirectory.Build.props), so it does not break the current build; it breaks once Tizen re-enables. Novel — "tizen" appears 0 times in the discussion. This is fix-before-merge, not disposition-changing. - New API written to Shipped.txt, not Unshipped.txt (from opus-4.8). Valid per
public-api.instructions.md(new public surface belongs inPublicAPI.Unshipped.txt; no Unshipped file is touched). Not inlined — already raised by the prior net11 fleet review ("edits PublicAPI.Shipped.txt (not just Unshipped) across all TFMs"). - Breaking
IList<Behavior>→IList<IBehavior>(gemini, gpt-5.5, opus-4.8). Real and invariant-breaking, but intentional/acknowledged and correctly on net11.0. Design-review item, not an inline code defect; already covered in discussion. - Design notes for discussion (not inlined): public
IBehaviorforces theAttachTo/DetachFromlifecycle into the public contract (opus-4.8); the new types are plainpublicwith no[Experimental]attribute (already raised in discussion); andGenericsIssuereflection cast (AttachedCollection<IBehavior>vsAttachedCollection<Behavior>) was reported failing by jsuarezruiz — the HEAD commit claims to address it, but no test results are available to confirm.
CI
Only license/cla has reported (pass). No build/unit/device/UI results available — merge-readiness and the GenericsIssue fix cannot be confirmed from CI; resolve via the design discussion and a full pipeline run.
| ~Microsoft.Maui.Controls.VisualElement.BackgroundColor.get -> Microsoft.Maui.Graphics.Color | ||
| ~Microsoft.Maui.Controls.VisualElement.BackgroundColor.set -> void | ||
| ~Microsoft.Maui.Controls.VisualElement.Behaviors.get -> System.Collections.Generic.IList<Microsoft.Maui.Controls.Behavior> | ||
| ~Microsoft.Maui.Controls.VisualElement.Behaviors.get -> System.Collections.Generic.IList<Microsoft.Maui.Controls.IBehavior> |
There was a problem hiding this comment.
net-tizen only updates VisualElement.Behaviors.get to reference IBehavior but omits the five declarations added to every other TFM: the IAttachedObject and IBehavior types, ~IBehavior<T>, and the ~IAttachedObject.AttachTo/DetachFrom members. IBehavior is now referenced here without being declared, so RS0016 would fire when the Tizen surface is analyzed. This won't break the current PR build (Tizen is disabled in CI via IncludeTizenTargetFrameworks=false in Directory.Build.props), but it leaves net-tizen inconsistent with the other six TFMs and will fail once Tizen is re-enabled. Add the missing entries to match net-android/net-ios/etc.:
Microsoft.Maui.Controls.IAttachedObject
Microsoft.Maui.Controls.IBehavior
~Microsoft.Maui.Controls.IAttachedObject.AttachTo(Microsoft.Maui.Controls.BindableObject bindable) -> void
~Microsoft.Maui.Controls.IAttachedObject.DetachFrom(Microsoft.Maui.Controls.BindableObject bindable) -> void
~Microsoft.Maui.Controls.IBehavior<T>
kubaflo
left a comment
There was a problem hiding this comment.
Could you please check the ai's suggestions?
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 of Change
Note
DISCLAIMER: This PR is for continued discussion only.
This PR is marked as experimental in the title of the PR. Reviewers please be are aware this should not be merged into a minor version or service release branch.
These changes include a breaking API change as
IAttachedObjectis being made public andVisualElement.Behaviorstype is changing fromIList<Behavior>toIList<IBehavior>.Doing so will enable behaviors to be assigned to anything (including VisualElement).
Pull Request Overview (Generated by Copilot):
This PR introduces an experimental
IBehaviorinterface in .NET MAUI to enable behaviors to be assigned to any object, not just those constrained by the concreteBehaviorclass. The change allows behaviors to inherit fromVisualElementwhile implementingIBehavior, potentially enablingDynamicResourcefunctionality through access to theResourceDictionary.Key Changes (Generated by Copilot):
IBehaviorandIBehavior<T>interfacesIAttachedObjectinterface public (previously internal)VisualElement.Behaviorsproperty type fromIList<Behavior>toIList<IBehavior>Reviewed Changes (Generated by Copilot):
IList<Behavior>toIList<IBehavior>IBehaviorandIBehavior<T>interfacesIAttachedObjectvisibility from internal to publicBehaviorandBehavior<T>to implementIBehaviorandIBehavior<T>respectivelyIssues Fixed
Fixes #