diff --git a/Perspex.Controls/Presenters/ItemsPresenter.cs b/Perspex.Controls/Presenters/ItemsPresenter.cs
index 109cc27679..a0d0fc1a7c 100644
--- a/Perspex.Controls/Presenters/ItemsPresenter.cs
+++ b/Perspex.Controls/Presenters/ItemsPresenter.cs
@@ -6,60 +6,90 @@
namespace Perspex.Controls.Presenters
{
+ using System.Collections;
+ using System.Collections.Specialized;
using Perspex.Controls.Generators;
using Perspex.Input;
using Perspex.Styling;
- using System;
- using System.Collections;
- using System.Collections.Specialized;
- using System.Reactive.Linq;
+ ///
+ /// Displays items inside an .
+ ///
public class ItemsPresenter : Control, IItemsPresenter, ITemplatedControl
{
+ ///
+ /// Defines the property.
+ ///
public static readonly PerspexProperty ItemsProperty =
ItemsControl.ItemsProperty.AddOwner();
+ ///
+ /// Defines the property.
+ ///
public static readonly PerspexProperty ItemsPanelProperty =
ItemsControl.ItemsPanelProperty.AddOwner();
private bool createdPanel;
+ private IItemContainerGenerator generator;
+
+ ///
+ /// Initializes static members of the class.
+ ///
static ItemsPresenter()
{
KeyboardNavigation.TabNavigationProperty.OverrideDefaultValue(
typeof(ItemsPresenter),
KeyboardNavigationMode.Once);
+ ItemsProperty.Changed.AddClassHandler(x => x.ItemsChanged);
}
- public ItemsPresenter()
+ ///
+ /// Gets the used to generate item container
+ /// controls.
+ ///
+ public IItemContainerGenerator ItemContainerGenerator
{
- this.GetObservableWithHistory(ItemsProperty).Subscribe(this.ItemsChanged);
- }
+ get
+ {
+ if (this.generator == null)
+ {
+ var i = this.TemplatedParent as ItemsControl;
+ this.generator = i?.ItemContainerGenerator ?? new ItemContainerGenerator(this);
+ }
- public ItemContainerGenerator ItemContainerGenerator
- {
- get;
- private set;
+ return this.generator;
+ }
}
+ ///
+ /// Gets or sets the items to be displayed.
+ ///
public IEnumerable Items
{
get { return this.GetValue(ItemsProperty); }
set { this.SetValue(ItemsProperty, value); }
}
+ ///
+ /// Gets or sets a template which creates the used to display the items.
+ ///
public ItemsPanelTemplate ItemsPanel
{
get { return this.GetValue(ItemsPanelProperty); }
set { this.SetValue(ItemsPanelProperty, value); }
}
+ ///
+ /// Gets the panel used to display the items.
+ ///
public Panel Panel
{
get;
private set;
}
+ ///
public override sealed void ApplyTemplate()
{
if (!this.createdPanel)
@@ -68,18 +98,24 @@ namespace Perspex.Controls.Presenters
}
}
+ ///
protected override Size MeasureOverride(Size availableSize)
{
this.Panel.Measure(availableSize);
return this.Panel.DesiredSize;
}
+ ///
protected override Size ArrangeOverride(Size finalSize)
{
this.Panel.Arrange(new Rect(finalSize));
return finalSize;
}
+ ///
+ /// Creates the when is called for the first
+ /// time.
+ ///
private void CreatePanel()
{
this.ClearVisualChildren();
@@ -89,32 +125,44 @@ namespace Perspex.Controls.Presenters
((IItemsPanel)this.Panel).ChildLogicalParent = this.TemplatedParent as ILogical;
this.AddVisualChild(this.Panel);
this.createdPanel = true;
- this.ItemsChanged(Tuple.Create(default(IEnumerable), this.Items));
+ this.CreateItemsAndListenForChanges(this.Items);
}
- private IItemContainerGenerator GetGenerator()
+ ///
+ /// Creates the items for a collection and starts listening for changes on the collection.
+ ///
+ /// The items, may be null.
+ private void CreateItemsAndListenForChanges(IEnumerable items)
{
- if (this.ItemContainerGenerator == null)
+ if (items != null)
{
- ItemsControl i = this.TemplatedParent as ItemsControl;
- this.ItemContainerGenerator = i?.ItemContainerGenerator ?? new ItemContainerGenerator(this);
- }
+ this.Panel.Children.AddRange(this.ItemContainerGenerator.Generate(this.Items));
- return this.ItemContainerGenerator;
+ INotifyCollectionChanged incc = items as INotifyCollectionChanged;
+
+ if (incc != null)
+ {
+ incc.CollectionChanged += this.ItemsCollectionChanged;
+ }
+ }
}
- private void ItemsChanged(Tuple value)
+ ///
+ /// Called when the property changes.
+ ///
+ /// The event args.
+ private void ItemsChanged(PerspexPropertyChangedEventArgs e)
{
if (this.createdPanel)
{
- var generator = this.GetGenerator();
+ var generator = this.ItemContainerGenerator;
- if (value.Item1 != null)
+ if (e.OldValue != null)
{
generator.RemoveAll();
this.Panel.Children.Clear();
- INotifyCollectionChanged incc = value.Item1 as INotifyCollectionChanged;
+ INotifyCollectionChanged incc = e.OldValue as INotifyCollectionChanged;
if (incc != null)
{
@@ -124,26 +172,21 @@ namespace Perspex.Controls.Presenters
if (this.Panel != null)
{
- if (value.Item2 != null)
- {
- this.Panel.Children.AddRange(generator.Generate(this.Items));
-
- INotifyCollectionChanged incc = value.Item2 as INotifyCollectionChanged;
-
- if (incc != null)
- {
- incc.CollectionChanged += this.ItemsCollectionChanged;
- }
- }
+ this.CreateItemsAndListenForChanges((IEnumerable)e.NewValue);
}
}
}
+ ///
+ /// Called when the collection changes.
+ ///
+ /// The sender.
+ /// The event args.
private void ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (this.createdPanel)
{
- var generator = this.GetGenerator();
+ var generator = this.ItemContainerGenerator;
// TODO: Handle Move and Replace etc.
switch (e.Action)