diff --git a/src/Perspex.Controls/Control.cs b/src/Perspex.Controls/Control.cs
index 901b744451..81015e196b 100644
--- a/src/Perspex.Controls/Control.cs
+++ b/src/Perspex.Controls/Control.cs
@@ -2,14 +2,12 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
-using System.Linq;
using System.Reactive.Linq;
using Perspex.Collections;
using Perspex.Controls.Primitives;
using Perspex.Controls.Templates;
using Perspex.Input;
using Perspex.Interactivity;
-using Perspex.LogicalTree;
using Perspex.Rendering;
using Perspex.Styling;
@@ -46,7 +44,7 @@ namespace Perspex.Controls
/// Defines the property.
///
public static readonly PerspexProperty ParentProperty =
- PerspexProperty.Register(nameof(Parent));
+ PerspexProperty.RegisterDirect(nameof(Parent), o => o.Parent);
///
/// Defines the property.
@@ -66,16 +64,12 @@ namespace Perspex.Controls
public static readonly RoutedEvent RequestBringIntoViewEvent =
RoutedEvent.Register("RequestBringIntoView", RoutingStrategies.Bubble);
+ private IControl _parent;
private readonly Classes _classes = new Classes();
-
private DataTemplates _dataTemplates;
-
private IControl _focusAdorner;
-
private string _id;
-
private IPerspexList _logicalChildren;
-
private Styles _styles;
///
@@ -227,7 +221,7 @@ namespace Perspex.Controls
///
/// Gets the control's logical parent.
///
- public IControl Parent => GetValue(ParentProperty);
+ public IControl Parent => _parent;
///
/// Gets or sets a user-defined object attached to the control.
@@ -297,7 +291,7 @@ namespace Perspex.Controls
throw new InvalidOperationException("The Control already has a parent.");
}
- SetValue(ParentProperty, parent);
+ SetAndRaise(ParentProperty, ref _parent, (IControl)parent);
}
///
diff --git a/src/Perspex.Controls/ItemsControl.cs b/src/Perspex.Controls/ItemsControl.cs
index 2939347e67..6539cffae5 100644
--- a/src/Perspex.Controls/ItemsControl.cs
+++ b/src/Perspex.Controls/ItemsControl.cs
@@ -33,7 +33,7 @@ namespace Perspex.Controls
/// Defines the property.
///
public static readonly PerspexProperty ItemsProperty =
- PerspexProperty.Register(nameof(Items));
+ PerspexProperty.RegisterDirect(nameof(Items), o => o.Items, (o, v) => o.Items = v);
///
/// Defines the property.
@@ -47,6 +47,7 @@ namespace Perspex.Controls
public static readonly PerspexProperty MemberSelectorProperty =
PerspexProperty.Register(nameof(MemberSelector));
+ private IEnumerable _items;
private IItemContainerGenerator _itemContainerGenerator;
///
@@ -63,7 +64,6 @@ namespace Perspex.Controls
public ItemsControl()
{
Classes.Add(":empty");
- Items = new PerspexList