Browse Source

Revert "Set ContentPresenter.DataContext in UpdateChild."

This reverts commit f3c7ea27a1.
pull/545/head
Steven Kirk 10 years ago
parent
commit
bf02ae41a9
  1. 92
      src/Avalonia.Controls/Presenters/ContentPresenter.cs
  2. 1
      tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs
  3. 4
      tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests.cs
  4. 1
      tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests.cs

92
src/Avalonia.Controls/Presenters/ContentPresenter.cs

@ -96,6 +96,10 @@ namespace Avalonia.Controls.Presenters
/// </summary> /// </summary>
public ContentPresenter() public ContentPresenter()
{ {
var dataContext = this.GetObservable(ContentProperty)
.Select(x => x is IControl ? AvaloniaProperty.UnsetValue : x);
Bind(Control.DataContextProperty, dataContext);
} }
/// <summary> /// <summary>
@ -217,72 +221,70 @@ namespace Avalonia.Controls.Presenters
/// </remarks> /// </remarks>
public void UpdateChild() public void UpdateChild()
{ {
var old = Child;
var content = Content; var content = Content;
var oldChild = Child; var result = content as IControl;
var newChild = content as IControl;
if (content != null && newChild == null) if (result == null)
{ {
// We have content and it isn't a control, so first try to recycle the existing DataContext = content;
// child control to display the new data by querying if the template that created
// the child can recycle items and that it also matches the new data. if (content != null)
if (oldChild != null &&
_dataTemplate != null &&
_dataTemplate.SupportsRecycling &&
_dataTemplate.Match(content))
{
newChild = oldChild;
}
else
{ {
// We couldn't recycle an existing control so find a data template for the data if (old != null &&
// and use it to create a control. _dataTemplate != null &&
_dataTemplate = this.FindDataTemplate(content, ContentTemplate) ?? FuncDataTemplate.Default; _dataTemplate.SupportsRecycling &&
newChild = _dataTemplate.Build(content); _dataTemplate.Match(content))
{
result = old;
}
else
{
_dataTemplate = this.FindDataTemplate(content, ContentTemplate) ?? FuncDataTemplate.Default;
result = _dataTemplate.Build(content);
// Try to give the new control its own name scope. var controlResult = result as Control;
var controlResult = newChild as Control;
if (controlResult != null) if (controlResult != null)
{ {
NameScope.SetNameScope(controlResult, new NameScope()); NameScope.SetNameScope(controlResult, new NameScope());
}
} }
} }
else
{
_dataTemplate = null;
}
} }
else else
{ {
_dataTemplate = null; _dataTemplate = null;
} }
// Remove the old child if we're not recycling it. if (result != old)
if (oldChild != null && newChild != oldChild)
{ {
VisualChildren.Remove(oldChild); if (old != null)
} {
VisualChildren.Remove(old);
}
// Set the DataContext if the data isn't a control. if (result != null)
if (!(content is IControl)) {
{ ((ISetInheritanceParent)result).SetParent(this);
DataContext = content;
}
// Update the Child. Child = result;
if (newChild == null)
{
Child = null;
}
else if (newChild != oldChild)
{
((ISetInheritanceParent)newChild).SetParent(this);
Child = newChild; if (result.Parent == null)
{
((ISetLogicalParent)result).SetParent((ILogical)this.TemplatedParent ?? this);
}
if (newChild.Parent == null) VisualChildren.Add(result);
}
else
{ {
((ISetLogicalParent)newChild).SetParent((ILogical)this.TemplatedParent ?? this); Child = null;
} }
VisualChildren.Add(newChild);
} }
_createdChild = true; _createdChild = true;

1
tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs

@ -370,7 +370,6 @@ namespace Avalonia.Controls.UnitTests
target.Presenter.ApplyTemplate(); target.Presenter.ApplyTemplate();
var dataContexts = target.Presenter.Panel.Children var dataContexts = target.Presenter.Panel.Children
.Do(x => (x as ContentPresenter)?.UpdateChild())
.Cast<Control>() .Cast<Control>()
.Select(x => x.DataContext) .Select(x => x.DataContext)
.ToList(); .ToList();

4
tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests.cs

@ -143,15 +143,13 @@ namespace Avalonia.Controls.UnitTests.Presenters
} }
[Fact] [Fact]
public void Assigning_NonControl_To_Content_Should_Set_DataContext_On_UpdateChild() public void Assigning_NonControl_To_Content_Should_Set_DataContext()
{ {
var target = new ContentPresenter var target = new ContentPresenter
{ {
Content = "foo", Content = "foo",
}; };
target.UpdateChild();
Assert.Equal("foo", target.DataContext); Assert.Equal("foo", target.DataContext);
} }

1
tests/Avalonia.Controls.UnitTests/Presenters/ItemsPresenterTests.cs

@ -312,7 +312,6 @@ namespace Avalonia.Controls.UnitTests.Presenters
var dataContexts = target.Panel.Children var dataContexts = target.Panel.Children
.Cast<ContentPresenter>() .Cast<ContentPresenter>()
.Do(x => x.UpdateChild())
.Select(x => x.DataContext) .Select(x => x.DataContext)
.ToList(); .ToList();

Loading…
Cancel
Save