|
|
|
@ -219,40 +219,7 @@ namespace Avalonia.Controls.Presenters |
|
|
|
{ |
|
|
|
var content = Content; |
|
|
|
var oldChild = Child; |
|
|
|
var newChild = content as IControl; |
|
|
|
|
|
|
|
if (content != null && newChild == null) |
|
|
|
{ |
|
|
|
// We have content and it isn't a control, so first try to recycle the existing
|
|
|
|
// 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 (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
|
|
|
|
// and use it to create a control.
|
|
|
|
_dataTemplate = this.FindDataTemplate(content, ContentTemplate) ?? FuncDataTemplate.Default; |
|
|
|
newChild = _dataTemplate.Build(content); |
|
|
|
|
|
|
|
// Try to give the new control its own name scope.
|
|
|
|
var controlResult = newChild as Control; |
|
|
|
|
|
|
|
if (controlResult != null) |
|
|
|
{ |
|
|
|
NameScope.SetNameScope(controlResult, new NameScope()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_dataTemplate = null; |
|
|
|
} |
|
|
|
var newChild = CreateChild(); |
|
|
|
|
|
|
|
// Remove the old child if we're not recycling it.
|
|
|
|
if (oldChild != null && newChild != oldChild) |
|
|
|
@ -330,6 +297,52 @@ namespace Avalonia.Controls.Presenters |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Creates the child control.
|
|
|
|
/// </summary>
|
|
|
|
/// <returns>The child control or null.</returns>
|
|
|
|
protected virtual IControl CreateChild() |
|
|
|
{ |
|
|
|
var content = Content; |
|
|
|
var oldChild = Child; |
|
|
|
var newChild = content as IControl; |
|
|
|
|
|
|
|
if (content != null && newChild == null) |
|
|
|
{ |
|
|
|
// We have content and it isn't a control, so first try to recycle the existing
|
|
|
|
// 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 (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
|
|
|
|
// and use it to create a control.
|
|
|
|
_dataTemplate = this.FindDataTemplate(content, ContentTemplate) ?? FuncDataTemplate.Default; |
|
|
|
newChild = _dataTemplate.Build(content); |
|
|
|
|
|
|
|
// Try to give the new control its own name scope.
|
|
|
|
var controlResult = newChild as Control; |
|
|
|
|
|
|
|
if (controlResult != null) |
|
|
|
{ |
|
|
|
NameScope.SetNameScope(controlResult, new NameScope()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
_dataTemplate = null; |
|
|
|
} |
|
|
|
|
|
|
|
return newChild; |
|
|
|
} |
|
|
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
protected override Size MeasureOverride(Size availableSize) |
|
|
|
{ |
|
|
|
|