diff --git a/samples/BindingDemo/MainWindow.xaml b/samples/BindingDemo/MainWindow.xaml
index 14c371efef..735e2d7102 100644
--- a/samples/BindingDemo/MainWindow.xaml
+++ b/samples/BindingDemo/MainWindow.xaml
@@ -75,11 +75,11 @@
-
+
-
+
diff --git a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
index 66800a606c..600e03ea47 100644
--- a/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
+++ b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
@@ -28,7 +28,7 @@ namespace BindingDemo.ViewModels
Detail = "Item " + x + " details",
}));
- Selection = new SelectionModel();
+ SelectedItems = new ObservableCollection();
ShuffleItems = ReactiveCommand.Create(() =>
{
@@ -57,7 +57,7 @@ namespace BindingDemo.ViewModels
}
public ObservableCollection Items { get; }
- public SelectionModel Selection { get; }
+ public ObservableCollection SelectedItems { get; }
public ReactiveCommand ShuffleItems { get; }
public string BooleanString
diff --git a/samples/ControlCatalog/Pages/ListBoxPage.xaml b/samples/ControlCatalog/Pages/ListBoxPage.xaml
index edf3d41bf5..c92ea8f25b 100644
--- a/samples/ControlCatalog/Pages/ListBoxPage.xaml
+++ b/samples/ControlCatalog/Pages/ListBoxPage.xaml
@@ -11,7 +11,7 @@
Spacing="16">
-
+
diff --git a/samples/ControlCatalog/ViewModels/ListBoxPageViewModel.cs b/samples/ControlCatalog/ViewModels/ListBoxPageViewModel.cs
index 6bdb5c0103..7e8f4dbcee 100644
--- a/samples/ControlCatalog/ViewModels/ListBoxPageViewModel.cs
+++ b/samples/ControlCatalog/ViewModels/ListBoxPageViewModel.cs
@@ -15,16 +15,16 @@ namespace ControlCatalog.ViewModels
public ListBoxPageViewModel()
{
Items = new ObservableCollection(Enumerable.Range(1, 10000).Select(i => GenerateItem()));
- Selection = new SelectionModel();
- Selection.Select(1);
+ SelectedItems = new ObservableCollection();
+ SelectedItems.Add(Items[1]);
AddItemCommand = ReactiveCommand.Create(() => Items.Add(GenerateItem()));
RemoveItemCommand = ReactiveCommand.Create(() =>
{
- while (Selection.SelectedItems.Count > 0)
+ while (SelectedItems.Count > 0)
{
- Items.Remove((string)Selection.SelectedItems.First());
+ Items.Remove(SelectedItems.First());
}
});
@@ -32,17 +32,14 @@ namespace ControlCatalog.ViewModels
{
var random = new Random();
- using (Selection.Update())
- {
- Selection.ClearSelection();
- Selection.Select(random.Next(Items.Count - 1));
- }
+ SelectedItems.Clear();
+ SelectedItems.Add(Items[random.Next(Items.Count - 1)]);
});
}
public ObservableCollection Items { get; }
- public SelectionModel Selection { get; }
+ public ObservableCollection SelectedItems { get; }
public ReactiveCommand AddItemCommand { get; }
@@ -55,7 +52,6 @@ namespace ControlCatalog.ViewModels
get => _selectionMode;
set
{
- Selection.ClearSelection();
this.RaiseAndSetIfChanged(ref _selectionMode, value);
}
}
diff --git a/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs b/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs
index 5bc23e2fe5..210e281ed6 100644
--- a/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs
+++ b/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reactive;
@@ -18,8 +17,7 @@ namespace ControlCatalog.ViewModels
_root = new Node();
Items = _root.Children;
- Selection = new SelectionModel();
- Selection.SelectionChanged += SelectionChanged;
+ SelectedItems = new ObservableCollection();
AddItemCommand = ReactiveCommand.Create(AddItem);
RemoveItemCommand = ReactiveCommand.Create(RemoveItem);
@@ -27,7 +25,7 @@ namespace ControlCatalog.ViewModels
}
public ObservableCollection Items { get; }
- public SelectionModel Selection { get; }
+ public ObservableCollection SelectedItems { get; }
public ReactiveCommand AddItemCommand { get; }
public ReactiveCommand RemoveItemCommand { get; }
public ReactiveCommand SelectRandomItemCommand { get; }
@@ -37,24 +35,24 @@ namespace ControlCatalog.ViewModels
get => _selectionMode;
set
{
- Selection.ClearSelection();
+ SelectedItems.Clear();
this.RaiseAndSetIfChanged(ref _selectionMode, value);
}
}
private void AddItem()
{
- var parentItem = Selection.SelectedItems.Count > 0 ? (Node)Selection.SelectedItems[0] : _root;
+ var parentItem = SelectedItems.Count > 0 ? (Node)SelectedItems[0] : _root;
parentItem.AddItem();
}
private void RemoveItem()
{
- while (Selection.SelectedItems.Count > 0)
+ while (SelectedItems.Count > 0)
{
- Node lastItem = (Node)Selection.SelectedItems[0];
+ Node lastItem = (Node)SelectedItems[0];
RecursiveRemove(Items, lastItem);
- Selection.DeselectAt(Selection.SelectedIndices[0]);
+ SelectedItems.RemoveAt(0);
}
bool RecursiveRemove(ObservableCollection items, Node selectedItem)
@@ -80,16 +78,16 @@ namespace ControlCatalog.ViewModels
{
var random = new Random();
var depth = random.Next(4);
- var indexes = Enumerable.Range(0, 4).Select(x => random.Next(10));
- var path = new IndexPath(indexes);
- Selection.SelectedIndex = path;
- }
+ var indexes = Enumerable.Range(0, depth).Select(x => random.Next(10));
+ var node = _root;
- private void SelectionChanged(object sender, SelectionModelSelectionChangedEventArgs e)
- {
- var selected = string.Join(",", e.SelectedIndices);
- var deselected = string.Join(",", e.DeselectedIndices);
- System.Diagnostics.Debug.WriteLine($"Selected '{selected}', Deselected '{deselected}'");
+ foreach (var i in indexes)
+ {
+ node = node.Children[i];
+ }
+
+ SelectedItems.Clear();
+ SelectedItems.Add(node);
}
public class Node
diff --git a/samples/VirtualizationDemo/MainWindow.xaml b/samples/VirtualizationDemo/MainWindow.xaml
index 4bd657bf93..dfe7524997 100644
--- a/samples/VirtualizationDemo/MainWindow.xaml
+++ b/samples/VirtualizationDemo/MainWindow.xaml
@@ -44,8 +44,8 @@
SelectedItems { get; }
+ = new AvaloniaList();
public AvaloniaList Items
{
@@ -137,9 +138,9 @@ namespace VirtualizationDemo.ViewModels
{
var index = Items.Count;
- if (Selection.SelectedIndices.Count > 0)
+ if (SelectedItems.Count > 0)
{
- index = Selection.SelectedIndex.GetAt(0);
+ index = Items.IndexOf(SelectedItems[0]);
}
Items.Insert(index, new ItemViewModel(_newItemIndex++, NewItemString));
@@ -147,9 +148,9 @@ namespace VirtualizationDemo.ViewModels
private void Remove()
{
- if (Selection.SelectedItems.Count > 0)
+ if (SelectedItems.Count > 0)
{
- Items.RemoveAll(Selection.SelectedItems.Cast().ToList());
+ Items.RemoveAll(SelectedItems);
}
}
@@ -163,7 +164,8 @@ namespace VirtualizationDemo.ViewModels
private void SelectItem(int index)
{
- Selection.SelectedIndex = new IndexPath(index);
+ SelectedItems.Clear();
+ SelectedItems.Add(Items[index]);
}
}
}
diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs
index 27313b0b4c..bd9d7e0c97 100644
--- a/src/Avalonia.Controls/ComboBox.cs
+++ b/src/Avalonia.Controls/ComboBox.cs
@@ -347,7 +347,7 @@ namespace Avalonia.Controls
if (container == null && SelectedIndex != -1)
{
- ScrollIntoView(Selection.SelectedIndex);
+ ScrollIntoView(SelectedItems[0]);
container = ItemContainerGenerator.ContainerFromIndex(selectedIndex);
}
diff --git a/src/Avalonia.Controls/ISelectionModel.cs b/src/Avalonia.Controls/ISelectionModel.cs
deleted file mode 100644
index 6570921c03..0000000000
--- a/src/Avalonia.Controls/ISelectionModel.cs
+++ /dev/null
@@ -1,249 +0,0 @@
-// This source file is adapted from the WinUI project.
-// (https://github.com/microsoft/microsoft-ui-xaml)
-//
-// Licensed to The Avalonia Project under MIT License, courtesy of The .NET Foundation.
-
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-
-namespace Avalonia.Controls
-{
- ///
- /// Holds the selected items for a control.
- ///
- public interface ISelectionModel : INotifyPropertyChanged
- {
- ///
- /// Gets or sets the anchor index.
- ///
- IndexPath AnchorIndex { get; set; }
-
- ///
- /// Gets or set the index of the first selected item.
- ///
- IndexPath SelectedIndex { get; set; }
-
- ///
- /// Gets or set the indexes of the selected items.
- ///
- IReadOnlyList SelectedIndices { get; }
-
- ///
- /// Gets the first selected item.
- ///
- object SelectedItem { get; }
-
- ///
- /// Gets the selected items.
- ///
- IReadOnlyList