Browse Source

Make ItemsControl items be logical children.

pull/39/head
Steven Kirk 12 years ago
parent
commit
f5a856e109
  1. 4
      Perspex.Controls/Control.cs
  2. 43
      Perspex.Controls/ItemsControl.cs
  3. 9
      Perspex.Controls/Panel.cs
  4. 2
      Perspex.Controls/Presenters/ItemsPresenter.cs

4
Perspex.Controls/Control.cs

@ -38,6 +38,8 @@ namespace Perspex.Controls
public static readonly RoutedEvent<RequestBringIntoViewEventArgs> RequestBringIntoViewEvent =
RoutedEvent.Register<Control, RequestBringIntoViewEventArgs>("RequestBringIntoView", RoutingStrategy.Bubble);
private static readonly IReadOnlyPerspexList<ILogical> EmptyChildren = new SingleItemPerspexList<ILogical>();
private Classes classes = new Classes();
private DataTemplates dataTemplates;
@ -167,7 +169,7 @@ namespace Perspex.Controls
IReadOnlyPerspexList<ILogical> ILogical.LogicalChildren
{
get { throw new NotImplementedException(); }
get { return EmptyChildren; }
}
public void BringIntoView()

43
Perspex.Controls/ItemsControl.cs

@ -11,10 +11,13 @@ namespace Perspex.Controls
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Perspex.Collections;
using Perspex.Controls.Generators;
using Perspex.Controls.Presenters;
using Perspex.Controls.Primitives;
using Perspex.VisualTree;
public class ItemsControl : TemplatedControl
public class ItemsControl : TemplatedControl, ILogical
{
[SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1202:ElementsMustBeOrderedByAccess", Justification = "Needs to be before or a NullReferenceException is thrown.")]
private static readonly ItemsPanelTemplate DefaultPanel =
@ -28,6 +31,10 @@ namespace Perspex.Controls
private ItemContainerGenerator itemContainerGenerator;
private PerspexReadOnlyListView<IVisual, ILogical> logicalChildren;
private ItemsPresenter presenter;
public ItemsControl()
{
this.GetObservableWithHistory(ItemsProperty).Subscribe(this.ItemsChanged);
@ -58,11 +65,45 @@ namespace Perspex.Controls
set { this.SetValue(ItemsPanelProperty, value); }
}
IReadOnlyPerspexList<ILogical> ILogical.LogicalChildren
{
get
{
if (this.logicalChildren == null)
{
this.logicalChildren = new PerspexReadOnlyListView<IVisual, ILogical>(
new PerspexList<IVisual>(),
x => (ILogical)x);
}
return this.logicalChildren;
}
}
protected virtual ItemContainerGenerator CreateItemContainerGenerator()
{
return new ItemContainerGenerator(this);
}
protected override void OnTemplateApplied()
{
if (this.logicalChildren != null)
{
this.logicalChildren.Dispose();
this.logicalChildren = null;
}
this.presenter = this.FindTemplateChild<ItemsPresenter>("presenter");
if (presenter != null)
{
var panel = (IVisual)this.presenter.GetVisualChildren().Single();
this.logicalChildren = new PerspexReadOnlyListView<IVisual, ILogical>(
panel.VisualChildren,
x => (ILogical)x);
}
}
private void ItemsChanged(Tuple<IEnumerable, IEnumerable> value)
{
INotifyPropertyChanged inpc = value.Item1 as INotifyPropertyChanged;

9
Perspex.Controls/Panel.cs

@ -62,6 +62,13 @@ namespace Perspex.Controls
private void ChildrenChanged(object sender, NotifyCollectionChangedEventArgs e)
{
var logicalParent = (Control)this;
while (logicalParent.TemplatedParent != null)
{
logicalParent = (Control)logicalParent.TemplatedParent;
}
// TODO: Handle Move and Replace.
switch (e.Action)
{
@ -70,7 +77,7 @@ namespace Perspex.Controls
foreach (var child in e.NewItems.OfType<Control>())
{
child.Parent = this;
child.Parent = logicalParent;
}
break;

2
Perspex.Controls/Presenters/ItemsPresenter.cs

@ -26,7 +26,7 @@ namespace Perspex.Controls.Presenters
public ItemsPresenter()
{
this.GetObservableWithHistory(ItemsProperty).Skip(1).Subscribe(this.ItemsChanged);
this.GetObservableWithHistory(ItemsProperty).Subscribe(this.ItemsChanged);
}
public IEnumerable Items

Loading…
Cancel
Save