diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs
index 94ad985046..e964673845 100644
--- a/src/Avalonia.Controls/Control.cs
+++ b/src/Avalonia.Controls/Control.cs
@@ -37,7 +37,6 @@ namespace Avalonia.Controls
///
/// Defines the property.
///
- [Obsolete("Prefer ContextFlyout")]
public static readonly StyledProperty ContextMenuProperty =
AvaloniaProperty.Register(nameof(ContextMenu));
@@ -77,7 +76,6 @@ namespace Avalonia.Controls
///
/// Gets or sets a context menu to the control.
///
- [Obsolete("Prefer ContextFlyout")]
public ContextMenu? ContextMenu
{
get => GetValue(ContextMenuProperty);
diff --git a/src/Avalonia.Controls/Selection/InternalSelectionModel.cs b/src/Avalonia.Controls/Selection/InternalSelectionModel.cs
index c9d91b1ae6..73c0184ebb 100644
--- a/src/Avalonia.Controls/Selection/InternalSelectionModel.cs
+++ b/src/Avalonia.Controls/Selection/InternalSelectionModel.cs
@@ -80,10 +80,12 @@ namespace Avalonia.Controls.Selection
try
{
_ignoreSelectedItemsChanges = true;
+ ++_ignoreModelChanges;
base.SetSource(value);
}
finally
{
+ --_ignoreModelChanges;
_ignoreSelectedItemsChanges = false;
}
@@ -93,17 +95,14 @@ namespace Avalonia.Controls.Selection
}
else
{
- foreach (var i in oldSelection)
- {
- var index = ItemsView!.IndexOf(i);
- Select(index);
- }
+ SyncFromSelectedItems();
}
}
private void SyncToSelectedItems()
{
- if (_writableSelectedItems is object)
+ if (_writableSelectedItems is object &&
+ !SequenceEqual(_writableSelectedItems, base.SelectedItems))
{
try
{
@@ -224,6 +223,7 @@ namespace Avalonia.Controls.Selection
if (_isResetting)
{
--_ignoreModelChanges;
+ _isResetting = false;
}
}
@@ -310,5 +310,27 @@ namespace Avalonia.Controls.Selection
return -1;
}
+
+ private static bool SequenceEqual(IList first, IReadOnlyList