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 @@ +