Browse Source

Implement functionality for added controls in TreeViewPage.xaml.cs

pull/2694/head
Ivan Kochurkin 7 years ago
parent
commit
6f58bb0e39
  1. 2
      samples/ControlCatalog/Pages/ListBoxPage.xaml.cs
  2. 93
      samples/ControlCatalog/Pages/TreeViewPage.xaml.cs

2
samples/ControlCatalog/Pages/ListBoxPage.xaml.cs

@ -36,7 +36,7 @@ namespace ControlCatalog.Pages
RemoveItemCommand = ReactiveCommand.Create(() => RemoveItemCommand = ReactiveCommand.Create(() =>
{ {
foreach (string selectedItem in listBox.SelectedItems) foreach (string selectedItem in _listBox.SelectedItems)
{ {
Items.Remove(selectedItem); Items.Remove(selectedItem);
} }

93
samples/ControlCatalog/Pages/TreeViewPage.xaml.cs

@ -1,8 +1,9 @@
using System.Collections; using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reactive;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using ReactiveUI;
namespace ControlCatalog.Pages namespace ControlCatalog.Pages
{ {
@ -10,8 +11,8 @@ namespace ControlCatalog.Pages
{ {
public TreeViewPage() public TreeViewPage()
{ {
this.InitializeComponent(); InitializeComponent();
DataContext = new Node().Children; DataContext = new PageViewModel(this.Find<TreeView>("treeView"));
} }
private void InitializeComponent() private void InitializeComponent()
@ -19,22 +20,96 @@ namespace ControlCatalog.Pages
AvaloniaXamlLoader.Load(this); AvaloniaXamlLoader.Load(this);
} }
public class Node private class PageViewModel : ReactiveObject
{ {
private IList<Node> _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<Node> 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<Node> Items { get; }
public ReactiveCommand<Unit, Unit> AddItemCommand { get; }
public ReactiveCommand<Unit, Unit> RemoveItemCommand { get; }
public SelectionMode SelectionMode
{
get => _selectionMode;
set
{
_treeView.SelectedItems.Clear();
this.RaiseAndSetIfChanged(ref _selectionMode, value);
}
}
}
private class Node
{
private int _counter;
private ObservableCollection<Node> _children;
public string Header { get; private set; } public string Header { get; private set; }
public IList<Node> Children
public bool AreChildrenInitialized => _children != null;
public ObservableCollection<Node> Children
{ {
get get
{ {
if (_children == null) if (_children == null)
{ {
_children = Enumerable.Range(1, 10).Select(i => new Node() {Header = $"Item {i}"}) _children = new ObservableCollection<Node>(Enumerable.Range(1, 10).Select(i => CreateNewNode()));
.ToArray();
} }
return _children; return _children;
} }
} }
public void AddNewItem() => Children.Add(CreateNewNode());
public override string ToString() => Header;
private Node CreateNewNode() => new Node {Header = $"Item {_counter++}"};
} }
} }
} }

Loading…
Cancel
Save