|
@@ -409,7 +409,7 @@ namespace Avalonia.Controls
|
|
|
|
|
|
|
|
if (this.SelectionMode == SelectionMode.Multiple && Match(keymap.SelectAll))
|
|
if (this.SelectionMode == SelectionMode.Multiple && Match(keymap.SelectAll))
|
|
|
{
|
|
{
|
|
|
- SelectingItemsControl.SynchronizeItems(SelectedItems, ItemContainerGenerator.Index.Items);
|
|
|
|
|
|
|
+ SynchronizeItems(SelectedItems, ItemContainerGenerator.Index.Items);
|
|
|
e.Handled = true;
|
|
e.Handled = true;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -521,7 +521,7 @@ namespace Avalonia.Controls
|
|
|
}
|
|
}
|
|
|
else if (multi && range)
|
|
else if (multi && range)
|
|
|
{
|
|
{
|
|
|
- SelectingItemsControl.SynchronizeItems(
|
|
|
|
|
|
|
+ SynchronizeItems(
|
|
|
SelectedItems,
|
|
SelectedItems,
|
|
|
GetItemsInRange(selectedContainer as TreeViewItem, container as TreeViewItem));
|
|
GetItemsInRange(selectedContainer as TreeViewItem, container as TreeViewItem));
|
|
|
}
|
|
}
|
|
@@ -778,5 +778,27 @@ namespace Avalonia.Controls
|
|
|
container.Classes.Set(":selected", selected);
|
|
container.Classes.Set(":selected", selected);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /// <summary>
|
|
|
|
|
+ /// Makes a list of objects equal another (though doesn't preserve order).
|
|
|
|
|
+ /// </summary>
|
|
|
|
|
+ /// <param name="items">The items collection.</param>
|
|
|
|
|
+ /// <param name="desired">The desired items.</param>
|
|
|
|
|
+ private static void SynchronizeItems(IList items, IEnumerable<object> desired)
|
|
|
|
|
+ {
|
|
|
|
|
+ var list = items.Cast<object>().ToList();
|
|
|
|
|
+ var toRemove = list.Except(desired).ToList();
|
|
|
|
|
+ var toAdd = desired.Except(list).ToList();
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var i in toRemove)
|
|
|
|
|
+ {
|
|
|
|
|
+ items.Remove(i);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ foreach (var i in toAdd)
|
|
|
|
|
+ {
|
|
|
|
|
+ items.Add(i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|