diff --git a/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj b/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj
index 2888640b07..eb679c3693 100644
--- a/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj
+++ b/tests/Perspex.Controls.UnitTests/Perspex.Controls.UnitTests.csproj
@@ -148,6 +148,10 @@
{3e53a01a-b331-47f3-b828-4a5717e77a24}
Perspex.Markup.Xaml
+
+ {6417e941-21bc-467b-a771-0de389353ce6}
+ Perspex.Markup
+
{D211E587-D8BC-45B9-95A4-F297C8FA5200}
Perspex.Animation
diff --git a/tests/Perspex.Controls.UnitTests/TreeViewTests.cs b/tests/Perspex.Controls.UnitTests/TreeViewTests.cs
index fdc86e4a2b..993449a295 100644
--- a/tests/Perspex.Controls.UnitTests/TreeViewTests.cs
+++ b/tests/Perspex.Controls.UnitTests/TreeViewTests.cs
@@ -1,13 +1,16 @@
// Copyright (c) The Perspex 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.Collections.Generic;
using System.Linq;
using Perspex.Collections;
using Perspex.Controls.Presenters;
using Perspex.Controls.Templates;
+using Perspex.Data;
using Perspex.Input;
using Perspex.LogicalTree;
+using Perspex.Markup.Data;
using Perspex.UnitTests;
using Xunit;
@@ -252,6 +255,36 @@ namespace Perspex.Controls.UnitTests
Assert.NotNull(NameScope.GetNameScope((TreeViewItem)item));
}
+ [Fact]
+ public void Should_React_To_Children_Changing()
+ {
+ var data = CreateTestTreeData();
+
+ var target = new TreeView
+ {
+ Template = CreateTreeViewTemplate(),
+ Items = data,
+ DataTemplates = CreateNodeDataTemplate(),
+ };
+
+ ApplyTemplates(target);
+
+ Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0));
+ Assert.Equal(new[] { "Child1", "Child2" }, ExtractItemHeader(target, 1));
+ Assert.Equal(new[] { "Grandchild2a" }, ExtractItemHeader(target, 2));
+
+ data[0].Children = new PerspexList
+ {
+ new Node
+ {
+ Value = "NewChild1",
+ }
+ };
+
+ Assert.Equal(new[] { "Root" }, ExtractItemHeader(target, 0));
+ Assert.Equal(new[] { "NewChild1" }, ExtractItemHeader(target, 1));
+ }
+
private void ApplyTemplates(TreeView tree)
{
tree.ApplyTemplate();
@@ -303,9 +336,7 @@ namespace Perspex.Controls.UnitTests
{
return new DataTemplates
{
- new FuncTreeDataTemplate(
- x => new TextBlock { Text = x.Value },
- x => x.Children),
+ new TestTreeDataTemplate()
};
}
@@ -360,10 +391,45 @@ namespace Perspex.Controls.UnitTests
}
}
- private class Node
+ private class Node : NotifyingBase
{
+ private IPerspexList _children;
+
public string Value { get; set; }
- public IPerspexList Children { get; set; }
+
+ public IPerspexList Children
+ {
+ get
+ {
+ return _children;
+ }
+
+ set
+ {
+ _children = value;
+ RaisePropertyChanged(nameof(Children));
+ }
+ }
+ }
+
+ private class TestTreeDataTemplate : ITreeDataTemplate
+ {
+ public IControl Build(object param)
+ {
+ var node = (Node)param;
+ return new TextBlock { Text = node.Value };
+ }
+
+ public InstancedBinding ItemsSelector(object item)
+ {
+ var obs = new ExpressionObserver(item, nameof(Node.Children));
+ return new InstancedBinding(obs);
+ }
+
+ public bool Match(object data)
+ {
+ return data is Node;
+ }
}
}
}
diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs
index 3ae9bb5ef5..35cd4a9917 100644
--- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs
+++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Indexer.cs
@@ -8,6 +8,7 @@ using System.Reactive.Linq;
using Perspex.Collections;
using Perspex.Diagnostics;
using Perspex.Markup.Data;
+using Perspex.UnitTests;
using Xunit;
namespace Perspex.Markup.UnitTests.Data
diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Observable.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Observable.cs
index bf8803912e..f11c8f25e8 100644
--- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Observable.cs
+++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Observable.cs
@@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using Perspex.Markup.Data;
+using Perspex.UnitTests;
using Xunit;
namespace Perspex.Markup.UnitTests.Data
diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs
index ee3ef3df78..8586f89ab6 100644
--- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs
+++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs
@@ -8,6 +8,7 @@ using System.Reactive.Linq;
using System.Reactive.Subjects;
using Microsoft.Reactive.Testing;
using Perspex.Markup.Data;
+using Perspex.UnitTests;
using Xunit;
namespace Perspex.Markup.UnitTests.Data
@@ -385,11 +386,6 @@ namespace Perspex.Markup.UnitTests.Data
RaisePropertyChanged(nameof(Next));
}
}
-
- public void RaisePropertyChanged(string propertyName)
- {
- base.RaisePropertyChanged(propertyName);
- }
}
private class Class2 : NotifyingBase, INext
diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_SetValue.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_SetValue.cs
index 166c11eb42..4281a7e590 100644
--- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_SetValue.cs
+++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_SetValue.cs
@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using Perspex.Markup.Data;
+using Perspex.UnitTests;
using Xunit;
namespace Perspex.Markup.UnitTests.Data
diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Task.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Task.cs
index b6c39ab28c..0ae2011ad4 100644
--- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Task.cs
+++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Task.cs
@@ -7,6 +7,7 @@ using System.Reactive.Linq;
using System.Threading;
using System.Threading.Tasks;
using Perspex.Markup.Data;
+using Perspex.UnitTests;
using Xunit;
namespace Perspex.Markup.UnitTests.Data
diff --git a/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj b/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj
index 185013373c..f63b05c890 100644
--- a/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj
+++ b/tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj
@@ -96,7 +96,6 @@
-
diff --git a/tests/Perspex.Markup.UnitTests/Data/NotifyingBase.cs b/tests/Perspex.UnitTests/NotifyingBase.cs
similarity index 90%
rename from tests/Perspex.Markup.UnitTests/Data/NotifyingBase.cs
rename to tests/Perspex.UnitTests/NotifyingBase.cs
index 384c3ede02..0d2e1c968c 100644
--- a/tests/Perspex.Markup.UnitTests/Data/NotifyingBase.cs
+++ b/tests/Perspex.UnitTests/NotifyingBase.cs
@@ -4,7 +4,7 @@
using System.ComponentModel;
using System.Linq;
-namespace Perspex.Markup.UnitTests.Data
+namespace Perspex.UnitTests
{
public class NotifyingBase : INotifyPropertyChanged
{
@@ -34,7 +34,7 @@ namespace Perspex.Markup.UnitTests.Data
private set;
}
- protected void RaisePropertyChanged(string propertyName)
+ public void RaisePropertyChanged(string propertyName)
{
_propertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
diff --git a/tests/Perspex.UnitTests/Perspex.UnitTests.csproj b/tests/Perspex.UnitTests/Perspex.UnitTests.csproj
index 675485d81b..21777675eb 100644
--- a/tests/Perspex.UnitTests/Perspex.UnitTests.csproj
+++ b/tests/Perspex.UnitTests/Perspex.UnitTests.csproj
@@ -62,6 +62,7 @@
+