diff --git a/Perspex.Controls/Generators/TypedItemContainerGenerator.cs b/Perspex.Controls/Generators/TypedItemContainerGenerator.cs index 5c30333665..dc9196b3a2 100644 --- a/Perspex.Controls/Generators/TypedItemContainerGenerator.cs +++ b/Perspex.Controls/Generators/TypedItemContainerGenerator.cs @@ -10,7 +10,7 @@ namespace Perspex.Controls.Generators public class TypedItemContainerGenerator : ItemContainerGenerator where T : ContentControl, new() { - public TypedItemContainerGenerator(ItemsControl owner) + public TypedItemContainerGenerator(Control owner) : base(owner) { } diff --git a/Perspex.Controls/Presenters/ItemsPresenter.cs b/Perspex.Controls/Presenters/ItemsPresenter.cs index a0d0fc1a7c..d57c7aa9c1 100644 --- a/Perspex.Controls/Presenters/ItemsPresenter.cs +++ b/Perspex.Controls/Presenters/ItemsPresenter.cs @@ -6,6 +6,7 @@ namespace Perspex.Controls.Presenters { + using System; using System.Collections; using System.Collections.Specialized; using Perspex.Controls.Generators; @@ -60,6 +61,16 @@ namespace Perspex.Controls.Presenters return this.generator; } + + set + { + if (this.generator != null) + { + throw new InvalidOperationException("ItemContainerGenerator is already set."); + } + + this.generator = value; + } } /// diff --git a/Tests/Perspex.Controls.UnitTests/Presenters/ItemsPresenterTests.cs b/Tests/Perspex.Controls.UnitTests/Presenters/ItemsPresenterTests.cs index 3a3c0781bb..e1b811c521 100644 --- a/Tests/Perspex.Controls.UnitTests/Presenters/ItemsPresenterTests.cs +++ b/Tests/Perspex.Controls.UnitTests/Presenters/ItemsPresenterTests.cs @@ -7,13 +7,113 @@ namespace Perspex.Controls.UnitTests.Presenters { using System.Linq; + using Perspex.Collections; + using Perspex.Controls.Generators; using Perspex.Controls.Presenters; using Perspex.Input; + using Perspex.LogicalTree; using Perspex.VisualTree; using Xunit; public class ItemsPresenterTests { + [Fact] + public void Should_Add_Containers() + { + var target = new ItemsPresenter + { + Items = new[] { "foo", "bar" }, + }; + + target.ApplyTemplate(); + + Assert.Equal(2, target.Panel.Children.Count); + Assert.IsType(target.Panel.Children[0]); + Assert.IsType(target.Panel.Children[1]); + Assert.Equal("foo", ((TextBlock)target.Panel.Children[0]).Text); + Assert.Equal("bar", ((TextBlock)target.Panel.Children[1]).Text); + } + + [Fact] + public void Should_Add_Containers_Of_Correct_Type() + { + var target = new ItemsPresenter + { + Items = new[] { "foo", "bar" }, + }; + + target.ItemContainerGenerator = new TypedItemContainerGenerator(target); + target.ApplyTemplate(); + + Assert.Equal(2, target.Panel.Children.Count); + Assert.IsType(target.Panel.Children[0]); + Assert.IsType(target.Panel.Children[1]); + } + + [Fact] + public void Should_Remove_Containers() + { + var items = new PerspexList(new[] { "foo", "bar" }); + var target = new ItemsPresenter + { + Items = items, + }; + + target.ApplyTemplate(); + items.RemoveAt(0); + + Assert.Equal(1, target.Panel.Children.Count); + Assert.Equal("bar", ((TextBlock)target.Panel.Children[0]).Text); + } + + [Fact] + public void Clearing_Items_Should_Remove_Containers() + { + var target = new ItemsPresenter + { + Items = new[] { "foo", "bar" }, + }; + + target.ApplyTemplate(); + target.Items = null; + + Assert.Empty(target.Panel.Children); + } + + [Fact] + public void Should_Handle_Null_Items() + { + var items = new PerspexList(new[] { "foo", null, "bar" }); + + var target = new ItemsPresenter + { + Items = items, + }; + + target.ApplyTemplate(); + items.RemoveAt(2); + + var text = target.Panel.Children.OfType().Select(x => x.Text).ToList(); + Assert.Equal(new[] { "foo", "bar" }, text); + } + + [Fact] + public void Should_Handle_Duplicate_Items() + { + var items = new PerspexList(new[] { 1, 2, 1 }); + + var target = new ItemsPresenter + { + Items = items, + }; + + target.ApplyTemplate(); + items.RemoveAt(2); + + var text = target.Panel.Children.OfType().Select(x => x.Text); + Assert.Equal(new[] { "1", "2" }, text); + } + [Fact] public void Panel_Should_Be_Created_From_ItemsPanel_Template() { @@ -70,18 +170,5 @@ namespace Perspex.Controls.UnitTests.Presenters Assert.Equal(target.Panel, child); } - - [Fact] - public void Items_Should_Be_Created_On_ApplyTemplate() - { - var target = new ItemsPresenter - { - Items = new[] { "foo", "bar" }, - }; - - target.ApplyTemplate(); - - Assert.Equal(2, target.Panel.GetVisualChildren().Count()); - } } }