diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs
index b476df5fda..ee2899e50c 100644
--- a/src/Avalonia.Controls/ItemsControl.cs
+++ b/src/Avalonia.Controls/ItemsControl.cs
@@ -573,15 +573,18 @@ namespace Avalonia.Controls
/// The event args.
private protected virtual void OnItemsViewCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
- switch (e.Action)
+ if (!_items.IsReadOnly)
{
- case NotifyCollectionChangedAction.Add:
- AddControlItemsToLogicalChildren(e.NewItems);
- break;
+ switch (e.Action)
+ {
+ case NotifyCollectionChangedAction.Add:
+ AddControlItemsToLogicalChildren(e.NewItems);
+ break;
- case NotifyCollectionChangedAction.Remove:
- RemoveControlItemsFromLogicalChildren(e.OldItems);
- break;
+ case NotifyCollectionChangedAction.Remove:
+ RemoveControlItemsFromLogicalChildren(e.OldItems);
+ break;
+ }
}
ItemCount = ItemsView.Count;
diff --git a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
index 9b28ca11f0..12fc0a82ed 100644
--- a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
+++ b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
@@ -249,6 +249,37 @@ namespace Avalonia.Controls.UnitTests
Assert.Null(((ILogical)child).LogicalParent);
}
+ [Fact]
+ public void Assigning_ItemsSource_Should_Not_Fire_LogicalChildren_CollectionChanged_Before_ApplyTemplate()
+ {
+ var target = new ItemsControl();
+ var child = new Control();
+ var called = false;
+
+ ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) => called = true;
+
+ var list = new AvaloniaList(new[] { child });
+ target.ItemsSource = list;
+
+ Assert.False(called);
+ }
+
+ [Fact]
+ public void Changing_ItemsSource_Should_Not_Fire_LogicalChildren_CollectionChanged_Before_ApplyTemplate()
+ {
+ var target = new ItemsControl();
+ var child = new Control();
+ var called = false;
+
+ ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) => called = true;
+
+ var list = new AvaloniaList();
+ target.ItemsSource = list;
+ list.Add(child);
+
+ Assert.False(called);
+ }
+
[Fact]
public void Clearing_Items_Should_Clear_Child_Controls_Parent()
{