diff --git a/samples/ControlCatalog/Pages/ListBoxPage.xaml b/samples/ControlCatalog/Pages/ListBoxPage.xaml
index 4783c8cfb8..49e9aafc4a 100644
--- a/samples/ControlCatalog/Pages/ListBoxPage.xaml
+++ b/samples/ControlCatalog/Pages/ListBoxPage.xaml
@@ -9,7 +9,20 @@
Margin="0,16,0,0"
HorizontalAlignment="Center"
Spacing="16">
-
+
+
+
+
+
+
+
+
+ Single
+ Multiple
+ Toggle
+ AlwaysSelected
+
+
diff --git a/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs b/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs
index dbe6c74800..8a67766c76 100644
--- a/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs
+++ b/samples/ControlCatalog/Pages/ListBoxPage.xaml.cs
@@ -1,9 +1,9 @@
-using System;
-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
{
@@ -11,9 +11,8 @@ namespace ControlCatalog.Pages
{
public ListBoxPage()
{
- this.InitializeComponent();
- DataContext = Enumerable.Range(1, 10).Select(i => $"Item {i}" )
- .ToArray();
+ InitializeComponent();
+ DataContext = new PageViewModel();
}
private void InitializeComponent()
@@ -21,5 +20,46 @@ namespace ControlCatalog.Pages
AvaloniaXamlLoader.Load(this);
}
+ private class PageViewModel : ReactiveObject
+ {
+ private int _counter;
+ private SelectionMode _selectionMode;
+
+ public PageViewModel()
+ {
+ Items = new ObservableCollection(Enumerable.Range(1, 10).Select(i => GenerateItem()));
+ SelectedItems = new ObservableCollection();
+
+ AddItemCommand = ReactiveCommand.Create(() => Items.Add(GenerateItem()));
+
+ RemoveItemCommand = ReactiveCommand.Create(() =>
+ {
+ while (SelectedItems.Count > 0)
+ {
+ Items.Remove(SelectedItems[0]);
+ }
+ });
+ }
+
+ public ObservableCollection Items { get; }
+
+ public ObservableCollection SelectedItems { get; }
+
+ public ReactiveCommand AddItemCommand { get; }
+
+ public ReactiveCommand RemoveItemCommand { get; }
+
+ public SelectionMode SelectionMode
+ {
+ get => _selectionMode;
+ set
+ {
+ SelectedItems.Clear();
+ this.RaiseAndSetIfChanged(ref _selectionMode, value);
+ }
+ }
+
+ private string GenerateItem() => $"Item {_counter++}";
+ }
}
}
diff --git a/samples/ControlCatalog/Pages/TreeViewPage.xaml b/samples/ControlCatalog/Pages/TreeViewPage.xaml
index c03edb8b03..3a81e2ed02 100644
--- a/samples/ControlCatalog/Pages/TreeViewPage.xaml
+++ b/samples/ControlCatalog/Pages/TreeViewPage.xaml
@@ -6,16 +6,29 @@
Displays a hierachical tree of data.
-
-
-
-
-
-
-
+ Margin="0,16,0,0"
+ HorizontalAlignment="Center"
+ Spacing="16">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Single
+ Multiple
+ Toggle
+ AlwaysSelected
+
+
diff --git a/samples/ControlCatalog/Pages/TreeViewPage.xaml.cs b/samples/ControlCatalog/Pages/TreeViewPage.xaml.cs
index a83f9cf43f..1f35f05f1d 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();
}
private void InitializeComponent()
@@ -19,22 +20,96 @@ namespace ControlCatalog.Pages
AvaloniaXamlLoader.Load(this);
}
- public class Node
+ private class PageViewModel : ReactiveObject
{
- private IList _children;
+ private SelectionMode _selectionMode;
+
+ public PageViewModel()
+ {
+ Node root = new Node();
+ Items = root.Children;
+ SelectedItems = new ObservableCollection();
+
+ AddItemCommand = ReactiveCommand.Create(() =>
+ {
+ Node parentItem = SelectedItems.Count > 0 ? SelectedItems[0] : root;
+ parentItem.AddNewItem();
+ });
+
+ RemoveItemCommand = ReactiveCommand.Create(() =>
+ {
+ while (SelectedItems.Count > 0)
+ {
+ Node lastItem = SelectedItems[0];
+ RecursiveRemove(Items, lastItem);
+ SelectedItems.Remove(lastItem);
+ }
+
+ 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 ObservableCollection SelectedItems { get; }
+
+ public ReactiveCommand AddItemCommand { get; }
+
+ public ReactiveCommand RemoveItemCommand { get; }
+
+ public SelectionMode SelectionMode
+ {
+ get => _selectionMode;
+ set
+ {
+ 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++}"};
}
}
}