From 362abd481cb5829c4c0510e74776f71ee56e2997 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 27 Jul 2015 22:13:18 +0200 Subject: [PATCH] Documented ItemsPresenter. And tidied up a couple of things. --- Perspex.Controls/Presenters/ItemsPresenter.cs | 111 ++++++++++++------ 1 file changed, 77 insertions(+), 34 deletions(-) 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)