diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs
index 0722802962..724c155efd 100644
--- a/src/Avalonia.Controls/ComboBox.cs
+++ b/src/Avalonia.Controls/ComboBox.cs
@@ -291,7 +291,7 @@ namespace Avalonia.Controls
if (container == null && SelectedIndex != -1)
{
- ScrollIntoView(Selection.SelectedItem);
+ ScrollIntoView(Selection.SelectedIndex);
container = ItemContainerGenerator.ContainerFromIndex(selectedIndex);
}
diff --git a/src/Avalonia.Controls/Presenters/IItemsPresenter.cs b/src/Avalonia.Controls/Presenters/IItemsPresenter.cs
index c4acf1ebef..a487ee390b 100644
--- a/src/Avalonia.Controls/Presenters/IItemsPresenter.cs
+++ b/src/Avalonia.Controls/Presenters/IItemsPresenter.cs
@@ -14,6 +14,6 @@ namespace Avalonia.Controls.Presenters
void ItemsChanged(NotifyCollectionChangedEventArgs e);
- void ScrollIntoView(object item);
+ void ScrollIntoView(int index);
}
}
diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs
index ae52e733b7..a25855ae49 100644
--- a/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs
+++ b/src/Avalonia.Controls/Presenters/ItemVirtualizer.cs
@@ -257,8 +257,8 @@ namespace Avalonia.Controls.Presenters
///
/// Scrolls the specified item into view.
///
- /// The item.
- public virtual void ScrollIntoView(object item)
+ /// The index of the item.
+ public virtual void ScrollIntoView(int index)
{
}
diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs
index 56f64779f6..f0b7fb41ff 100644
--- a/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs
+++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerNone.cs
@@ -67,18 +67,13 @@ namespace Avalonia.Controls.Presenters
///
/// Scrolls the specified item into view.
///
- /// The item.
- public override void ScrollIntoView(object item)
+ /// The index of the item.
+ public override void ScrollIntoView(int index)
{
- if (Items != null)
+ if (index != -1)
{
- var index = Items.IndexOf(item);
-
- if (index != -1)
- {
- var container = Owner.ItemContainerGenerator.ContainerFromIndex(index);
- container?.BringIntoView();
- }
+ var container = Owner.ItemContainerGenerator.ContainerFromIndex(index);
+ container?.BringIntoView();
}
}
diff --git a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
index d27de7a80d..2139c85f31 100644
--- a/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
+++ b/src/Avalonia.Controls/Presenters/ItemVirtualizerSimple.cs
@@ -289,20 +289,15 @@ namespace Avalonia.Controls.Presenters
break;
}
- return ScrollIntoView(newItemIndex);
+ return ScrollIntoViewCore(newItemIndex);
}
///
- public override void ScrollIntoView(object item)
+ public override void ScrollIntoView(int index)
{
- if (Items != null)
+ if (index != -1)
{
- var index = Items.IndexOf(item);
-
- if (index != -1)
- {
- ScrollIntoView(index);
- }
+ ScrollIntoViewCore(index);
}
}
@@ -514,7 +509,7 @@ namespace Avalonia.Controls.Presenters
///
/// The item index.
/// The container that was brought into view.
- private IControl ScrollIntoView(int index)
+ private IControl ScrollIntoViewCore(int index)
{
var panel = VirtualizingPanel;
var generator = Owner.ItemContainerGenerator;
diff --git a/src/Avalonia.Controls/Presenters/ItemsPresenter.cs b/src/Avalonia.Controls/Presenters/ItemsPresenter.cs
index ab40fbd53b..51e6b80d60 100644
--- a/src/Avalonia.Controls/Presenters/ItemsPresenter.cs
+++ b/src/Avalonia.Controls/Presenters/ItemsPresenter.cs
@@ -120,9 +120,9 @@ namespace Avalonia.Controls.Presenters
return Virtualizer?.GetControlInDirection(direction, from);
}
- public override void ScrollIntoView(object item)
+ public override void ScrollIntoView(int index)
{
- Virtualizer?.ScrollIntoView(item);
+ Virtualizer?.ScrollIntoView(index);
}
///
diff --git a/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs b/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs
index ef1f277162..f120d74b9a 100644
--- a/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs
+++ b/src/Avalonia.Controls/Presenters/ItemsPresenterBase.cs
@@ -142,7 +142,7 @@ namespace Avalonia.Controls.Presenters
}
///
- public virtual void ScrollIntoView(object item)
+ public virtual void ScrollIntoView(int index)
{
}
diff --git a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
index b1a4379cae..dc08448cd1 100644
--- a/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
+++ b/src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
@@ -339,11 +339,17 @@ namespace Avalonia.Controls.Primitives
base.EndInit();
}
+ ///
+ /// Scrolls the specified item into view.
+ ///
+ /// The index of the item.
+ public void ScrollIntoView(int index) => Presenter?.ScrollIntoView(index);
+
///
/// Scrolls the specified item into view.
///
/// The item.
- public void ScrollIntoView(object item) => Presenter?.ScrollIntoView(item);
+ public void ScrollIntoView(object item) => ScrollIntoView(IndexOf(Items, item));
///
/// Tries to get the container that was the source of an event.
@@ -665,12 +671,9 @@ namespace Avalonia.Controls.Primitives
{
if (e.PropertyName == nameof(SelectionModel.AnchorIndex) && AutoScrollToSelectedItem)
{
- var index = Selection.AnchorIndex.GetSize() > 0 ? Selection.AnchorIndex.GetAt(0) : -1;
- var item = index != -1 ? ElementAt(Items, index) : null;
-
- if (item != null)
+ if (Selection.AnchorIndex.GetSize() > 0)
{
- ScrollIntoView(item);
+ ScrollIntoView(Selection.AnchorIndex.GetAt(0));
}
}
}
diff --git a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs b/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
index b967b40c0d..bf29381eab 100644
--- a/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
+++ b/src/Avalonia.Dialogs/ManagedFileChooser.xaml.cs
@@ -81,7 +81,7 @@ namespace Avalonia.Dialogs
if (indexOfPreselected > 1)
{
- _filesView.ScrollIntoView(model.Items[indexOfPreselected - 1]);
+ _filesView.ScrollIntoView(indexOfPreselected - 1);
}
}
}
diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs
index 7a6cf0fba7..05124a282c 100644
--- a/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs
+++ b/tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests_Virtualization_Simple.cs
@@ -575,7 +575,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.Arrange(Rect.Empty);
// Check for issue #591: this should not throw.
- target.ScrollIntoView(items[0]);
+ target.ScrollIntoView(0);
}
}
@@ -729,7 +729,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var last = (target.Items as IList)[10];
- target.ScrollIntoView(last);
+ target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last);
@@ -746,12 +746,12 @@ namespace Avalonia.Controls.UnitTests.Presenters
var last = (target.Items as IList)[10];
- target.ScrollIntoView(last);
+ target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last);
- target.ScrollIntoView(last);
+ target.ScrollIntoView(10);
Assert.Equal(new Vector(0, 1), ((ILogicalScrollable)target).Offset);
Assert.Same(target.Panel.Children[9].DataContext, last);