// Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; using System.Linq; using ReactiveUI; namespace VirtualizationTest.ViewModels { internal class MainWindowViewModel : ReactiveObject { private int _itemCount = 200; private string _newItemString; private IReactiveList _items; private ItemViewModel _selectedItem; private string _prefix = "Item"; public MainWindowViewModel() { this.WhenAnyValue(x => x.ItemCount).Subscribe(ResizeItems); RecreateCommand = ReactiveCommand.Create(); RecreateCommand.Subscribe(_ => Recreate()); NewItemCommand = ReactiveCommand.Create(); NewItemCommand.Subscribe(_ => Create()); RemoveItemCommand = ReactiveCommand.Create(); RemoveItemCommand.Subscribe(_ => Remove()); } public string NewItemString { get { return _newItemString; } set { this.RaiseAndSetIfChanged(ref _newItemString, value); } } public int ItemCount { get { return _itemCount; } set { this.RaiseAndSetIfChanged(ref _itemCount, value); } } public ItemViewModel SelectedItem { get { return _selectedItem; } set { this.RaiseAndSetIfChanged(ref _selectedItem, value); } } public IReactiveList Items { get { return _items; } private set { this.RaiseAndSetIfChanged(ref _items, value); } } public ReactiveCommand NewItemCommand { get; private set; } public ReactiveCommand RecreateCommand { get; private set; } public ReactiveCommand RemoveItemCommand { get; private set; } private void ResizeItems(int count) { if (Items == null) { var items = Enumerable.Range(0, count) .Select(x => new ItemViewModel(x)); Items = new ReactiveList(items); } else if (count > Items.Count) { var items = Enumerable.Range(Items.Count, count - Items.Count) .Select(x => new ItemViewModel(x)); Items.AddRange(items); } else if (count < Items.Count) { Items.RemoveRange(count, Items.Count - count); } } private void Create() { Items.Add(new ItemViewModel(Items.Count, NewItemString)); } private void Remove() { if (SelectedItem != null) { Items.Remove(SelectedItem); } } private void Recreate() { _prefix = _prefix == "Item" ? "Recreated" : "Item"; var items = Enumerable.Range(0, _itemCount) .Select(x => new ItemViewModel(x, _prefix)); Items = new ReactiveList(items); } } }