From 6f58bb0e392081739453ac2fef67c93552b5fa55 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Sat, 29 Jun 2019 18:41:29 +0300 Subject: [PATCH] Implement functionality for added controls in TreeViewPage.xaml.cs --- .../ControlCatalog/Pages/ListBoxPage.xaml.cs | 2 +- .../ControlCatalog/Pages/TreeViewPage.xaml.cs | 93 +++++++++++++++++-- 2 files changed, 85 insertions(+), 10 deletions(-) diff --git a/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs b/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs index e1a615af4b..d6d48cd030 100644 --- a/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs +++ b/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs @@ -36,7 +36,7 @@ namespace ControlCatalog.Pages RemoveItemCommand = ReactiveCommand.Create(() => { - foreach (string selectedItem in listBox.SelectedItems) + foreach (string selectedItem in _listBox.SelectedItems) { Items.Remove(selectedItem); } diff --git a/samples/ControlCatalog/Pages/TreeViewPage.xaml.cs b/samples/ControlCatalog/Pages/TreeViewPage.xaml.cs index a83f9cf43f..cf6aa50db7 100644 --- a/samples/ControlCatalog/Pages/TreeViewPage.xaml.cs +++ b/samples/ControlCatalog/Pages/TreeViewPage.xaml.cs @@ -1,8 +1,9 @@ -using System.Collections; -using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Linq; +using System.Reactive; using Avalonia.Controls; using Avalonia.Markup.Xaml; +using ReactiveUI; namespace ControlCatalog.Pages { @@ -10,8 +11,8 @@ namespace ControlCatalog.Pages { public TreeViewPage() { - this.InitializeComponent(); - DataContext = new Node().Children; + InitializeComponent(); + DataContext = new PageViewModel(this.Find("treeView")); } private void InitializeComponent() @@ -19,22 +20,96 @@ namespace ControlCatalog.Pages AvaloniaXamlLoader.Load(this); } - public class Node + private class PageViewModel : ReactiveObject { - private IList _children; + private readonly TreeView _treeView; + private SelectionMode _selectionMode; + + public PageViewModel(TreeView treeView) + { + _treeView = treeView; + + Node root = new Node(); + Items = root.Children; + + AddItemCommand = ReactiveCommand.Create(() => + { + Node selectedItem = _treeView.SelectedItems.Count > 0 ? (Node)_treeView.SelectedItems[0] : root; + selectedItem.AddNewItem(); + }); + + RemoveItemCommand = ReactiveCommand.Create(() => + { + foreach (Node selectedItem in _treeView.SelectedItems) + { + RecursiveRemove(Items, selectedItem); + } + + _treeView.SelectedItems.Clear(); + + bool RecursiveRemove(ObservableCollection items, Node selectedItem) + { + if (items.Remove(selectedItem)) + { + return true; + } + + foreach (Node item in items) + { + if (item.AreChildrenInitialized && RecursiveRemove(item.Children, selectedItem)) + { + return true; + } + } + + return false; + } + }); + } + + public ObservableCollection Items { get; } + + public ReactiveCommand AddItemCommand { get; } + + public ReactiveCommand RemoveItemCommand { get; } + + public SelectionMode SelectionMode + { + get => _selectionMode; + set + { + _treeView.SelectedItems.Clear(); + this.RaiseAndSetIfChanged(ref _selectionMode, value); + } + } + } + + private class Node + { + private int _counter; + private ObservableCollection _children; + public string Header { get; private set; } - public IList Children + + public bool AreChildrenInitialized => _children != null; + + public ObservableCollection Children { get { if (_children == null) { - _children = Enumerable.Range(1, 10).Select(i => new Node() {Header = $"Item {i}"}) - .ToArray(); + _children = new ObservableCollection(Enumerable.Range(1, 10).Select(i => CreateNewNode())); } return _children; } } + + public void AddNewItem() => Children.Add(CreateNewNode()); + + public override string ToString() => Header; + + private Node CreateNewNode() => new Node {Header = $"Item {_counter++}"}; } } }