diff --git a/src/Perspex.Controls/ItemsControl.cs b/src/Perspex.Controls/ItemsControl.cs
index 27028cba4b..20344af928 100644
--- a/src/Perspex.Controls/ItemsControl.cs
+++ b/src/Perspex.Controls/ItemsControl.cs
@@ -239,7 +239,7 @@ namespace Perspex.Controls
{
// If the item is its own container, then it will be removed from the logical tree
// when it is removed from the Items collection.
- if (container.ContainerControl != container.Item)
+ if (container?.ContainerControl != container?.Item)
{
toRemove.Add(container.ContainerControl);
}
diff --git a/src/Perspex.Controls/Perspex.Controls.csproj b/src/Perspex.Controls/Perspex.Controls.csproj
index 8c62f1d66c..96481a1959 100644
--- a/src/Perspex.Controls/Perspex.Controls.csproj
+++ b/src/Perspex.Controls/Perspex.Controls.csproj
@@ -66,6 +66,7 @@
+
diff --git a/src/Perspex.Controls/Presenters/CarouselPresenter.cs b/src/Perspex.Controls/Presenters/CarouselPresenter.cs
index cde7bcf823..3ba9d14589 100644
--- a/src/Perspex.Controls/Presenters/CarouselPresenter.cs
+++ b/src/Perspex.Controls/Presenters/CarouselPresenter.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections;
+using System.Collections.Specialized;
using System.Linq;
using System.Reactive.Linq;
using System.Threading.Tasks;
@@ -18,7 +19,7 @@ namespace Perspex.Controls.Presenters
///
/// Displays pages inside an .
///
- public class CarouselPresenter : Control, IItemsPresenter
+ public class CarouselPresenter : ItemsPresenterBase
{
///
/// Defines the property.
@@ -26,24 +27,6 @@ namespace Perspex.Controls.Presenters
public static readonly StyledProperty IsVirtualizedProperty =
Carousel.IsVirtualizedProperty.AddOwner();
- ///
- /// Defines the property.
- ///
- public static readonly DirectProperty ItemsProperty =
- ItemsControl.ItemsProperty.AddOwner(o => o.Items, (o, v) => o.Items = v);
-
- ///
- /// Defines the property.
- ///
- public static readonly StyledProperty> ItemsPanelProperty =
- ItemsControl.ItemsPanelProperty.AddOwner();
-
- ///
- /// Defines the property.
- ///
- public static readonly StyledProperty MemberSelectorProperty =
- ItemsControl.MemberSelectorProperty.AddOwner();
-
///
/// Defines the property.
///
@@ -58,10 +41,7 @@ namespace Perspex.Controls.Presenters
public static readonly StyledProperty TransitionProperty =
Carousel.TransitionProperty.AddOwner();
- private IEnumerable _items;
private int _selectedIndex = -1;
- private bool _createdPanel;
- private IItemContainerGenerator _generator;
private Task _currentTransition;
private int _queuedTransitionIndex = -1;
@@ -71,35 +51,6 @@ namespace Perspex.Controls.Presenters
static CarouselPresenter()
{
SelectedIndexProperty.Changed.AddClassHandler(x => x.SelectedIndexChanged);
- TemplatedParentProperty.Changed.AddClassHandler(x => x.TemplatedParentChanged);
- }
-
- ///
- /// Gets the used to generate item container
- /// controls.
- ///
- public IItemContainerGenerator ItemContainerGenerator
- {
- get
- {
- if (_generator == null)
- {
- var i = TemplatedParent as ItemsControl;
- _generator = i?.ItemContainerGenerator ?? new ItemContainerGenerator(this);
- }
-
- return _generator;
- }
-
- set
- {
- if (_generator != null)
- {
- throw new InvalidOperationException("ItemContainerGenerator is already set.");
- }
-
- _generator = value;
- }
}
///
@@ -114,33 +65,6 @@ namespace Perspex.Controls.Presenters
set { SetValue(IsVirtualizedProperty, value); }
}
- ///
- /// Gets or sets the items to display.
- ///
- public IEnumerable Items
- {
- get { return _items; }
- set { SetAndRaise(ItemsProperty, ref _items, value); }
- }
-
- ///
- /// Gets or sets the panel used to display the pages.
- ///
- public ITemplate ItemsPanel
- {
- get { return GetValue(ItemsPanelProperty); }
- set { SetValue(ItemsPanelProperty, value); }
- }
-
- ///
- /// Selects a member from to use as the list item.
- ///
- public IMemberSelector MemberSelector
- {
- get { return GetValue(MemberSelectorProperty); }
- set { SetValue(MemberSelectorProperty, value); }
- }
-
///
/// Gets or sets the index of the selected page.
///
@@ -164,15 +88,6 @@ namespace Perspex.Controls.Presenters
}
}
- ///
- /// Gets the panel used to display the pages.
- ///
- public IPanel Panel
- {
- get;
- private set;
- }
-
///
/// Gets or sets a transition to use when switching pages.
///
@@ -183,29 +98,16 @@ namespace Perspex.Controls.Presenters
}
///
- public override sealed void ApplyTemplate()
+ protected override void CreatePanel()
{
- if (!_createdPanel)
- {
- CreatePanel();
- }
+ base.CreatePanel();
+ var task = MoveToPage(-1, SelectedIndex);
}
- ///
- /// Creates the .
- ///
- private void CreatePanel()
+ ///
+ protected override void ItemsChanged(NotifyCollectionChangedEventArgs e)
{
- Panel = ItemsPanel.Build();
- Panel.SetValue(TemplatedParentProperty, TemplatedParent);
-
- LogicalChildren.Clear();
- VisualChildren.Clear();
- LogicalChildren.Add(Panel);
- VisualChildren.Add(Panel);
-
- _createdPanel = true;
- var task = MoveToPage(-1, SelectedIndex);
+ // TODO: Handle items changing.
}
///
@@ -224,24 +126,13 @@ namespace Perspex.Controls.Presenters
if (fromIndex != -1)
{
- from = generator.ContainerFromIndex(fromIndex);
+ from = ItemContainerGenerator.ContainerFromIndex(fromIndex);
}
if (toIndex != -1)
{
var item = Items.Cast