Skip to content
This repository has been archived by the owner on May 1, 2024. It is now read-only.

Commit

Permalink
Ensure that reused ItemContentControl instances respect DataTemplateS…
Browse files Browse the repository at this point in the history
…elector
  • Loading branch information
hartez committed Jun 20, 2020
1 parent 7f4fd73 commit 1d054a3
Showing 1 changed file with 22 additions and 24 deletions.
46 changes: 22 additions & 24 deletions Xamarin.Forms.Platform.UAP/CollectionView/ItemContentControl.cs
Expand Up @@ -9,8 +9,9 @@ namespace Xamarin.Forms.Platform.UWP
{
public class ItemContentControl : ContentControl
{
View _view;
VisualElement _visualElement;
IVisualElementRenderer _renderer;
DataTemplate _currentTemplate;

public ItemContentControl()
{
Expand Down Expand Up @@ -104,11 +105,11 @@ protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);

if (oldContent != null && _view != null)
_view.MeasureInvalidated -= OnViewMeasureInvalidated;
if (oldContent != null && _visualElement != null)
_visualElement.MeasureInvalidated -= OnViewMeasureInvalidated;

if (newContent != null && _view != null)
_view.MeasureInvalidated += OnViewMeasureInvalidated;
if (newContent != null && _visualElement != null)
_visualElement.MeasureInvalidated += OnViewMeasureInvalidated;
}

internal void Realize()
Expand All @@ -129,31 +130,28 @@ internal void Realize()
return;
}

_view = FormsDataTemplate.CreateContent(dataContext, container) as View;
_view.BindingContext = dataContext;
_renderer = Platform.CreateRenderer(_view);
Platform.SetRenderer(_view, _renderer);

Content = _renderer.ContainerElement;

itemsView?.AddLogicalChild(_view);
if (_renderer?.ContainerElement == null)
if (_renderer?.ContainerElement == null || _currentTemplate != formsTemplate)
{
var view = FormsDataTemplate.CreateContent(dataContext, container) as View;
view.BindingContext = dataContext;
_renderer = Platform.CreateRenderer(view);
Platform.SetRenderer(view, _renderer);
Content = _renderer.ContainerElement;
itemsView?.AddLogicalChild(view);
// If the content has never been realized (i.e., this is a new instance),
// or if we need to switch DataTemplates (because this instance is being recycled)
// then we'll need to create the content from the template
_visualElement = formsTemplate.CreateContent(dataContext, container) as VisualElement;
_visualElement.BindingContext = dataContext;
_renderer = Platform.CreateRenderer(_visualElement);
Platform.SetRenderer(_visualElement, _renderer);

// Keep track of the template in case this instance gets reused later
_currentTemplate = formsTemplate;
}
else
{
// We are reusing this ItemContentControl and we can reuse the Element
var view = _renderer.Element;
view.BindingContext = dataContext;
Content = _renderer.ContainerElement;
itemsView?.AddLogicalChild(view);
_visualElement = _renderer.Element;
_visualElement.BindingContext = dataContext;
}

Content = _renderer.ContainerElement;
itemsView?.AddLogicalChild(_visualElement);
}

internal void UpdateIsSelected(bool isSelected)
Expand Down

0 comments on commit 1d054a3

Please sign in to comment.