using System; using System.Collections.ObjectModel; using System.Linq; using System.Reactive; using Avalonia.Controls; using Avalonia.Controls.Selection; using ReactiveUI; namespace ControlCatalog.ViewModels { public class ListBoxPageViewModel : ReactiveObject { private bool _multiple; private bool _toggle; private bool _alwaysSelected; private bool _autoScrollToSelectedItem = true; private int _counter; private ObservableAsPropertyHelper _selectionMode; public ListBoxPageViewModel() { Items = new ObservableCollection(Enumerable.Range(1, 10000).Select(i => GenerateItem())); Selection = new SelectionModel(); Selection.Select(1); _selectionMode = this.WhenAnyValue( x => x.Multiple, x => x.Toggle, x => x.AlwaysSelected, (m, t, a) => (m ? SelectionMode.Multiple : 0) | (t ? SelectionMode.Toggle : 0) | (a ? SelectionMode.AlwaysSelected : 0)) .ToProperty(this, x => x.SelectionMode); AddItemCommand = ReactiveCommand.Create(() => Items.Add(GenerateItem())); RemoveItemCommand = ReactiveCommand.Create(() => { while (Selection.Count > 0) { Items.Remove(Selection.SelectedItems.First()); } }); SelectRandomItemCommand = ReactiveCommand.Create(() => { var random = new Random(); using (Selection.BatchUpdate()) { Selection.Clear(); Selection.Select(random.Next(Items.Count - 1)); } }); } public ObservableCollection Items { get; } public SelectionModel Selection { get; } public SelectionMode SelectionMode => _selectionMode.Value; public bool Multiple { get => _multiple; set => this.RaiseAndSetIfChanged(ref _multiple, value); } public bool Toggle { get => _toggle; set => this.RaiseAndSetIfChanged(ref _toggle, value); } public bool AlwaysSelected { get => _alwaysSelected; set => this.RaiseAndSetIfChanged(ref _alwaysSelected, value); } public bool AutoScrollToSelectedItem { get => _autoScrollToSelectedItem; set => this.RaiseAndSetIfChanged(ref _autoScrollToSelectedItem, value); } public ReactiveCommand AddItemCommand { get; } public ReactiveCommand RemoveItemCommand { get; } public ReactiveCommand SelectRandomItemCommand { get; } private string GenerateItem() => $"Item {_counter++.ToString()}"; } }