Skip to content

Commit

Permalink
[iOS] Fixed Collection View header and footer update (#20210)
Browse files Browse the repository at this point in the history
* Fixed Collection View header and footer update [iOS] (#19379)

* Added UITest

* Added pending snapshot

* [iOS] Correctly fix the CollectionView mappers hierarchy

---------

Co-authored-by: javiersuarezruiz@hotmail.com <javiersuarezruiz@hotmail.com>
Co-authored-by: Rui Marinho <me@ruimarinho.net>
  • Loading branch information
3 people committed Feb 7, 2024
1 parent 75be404 commit 1138b62
Show file tree
Hide file tree
Showing 11 changed files with 164 additions and 100 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Maui.Controls.Sample.Issues.Issue19379"
xmlns:ns="clr-namespace:Maui.Controls.Sample.Issues">
<VerticalStackLayout
Padding="30,0"
Spacing="25">
<Label
AutomationId="WaitForStubControl"
Text="Issue 19379"/>
<CollectionView
Header="{Binding CustomHeader, Mode=TwoWay}"
ItemsSource="{Binding ItemList}">
<CollectionView.HeaderTemplate>
<DataTemplate>
<ContentView>
<Label
Text="{Binding Title}"
BackgroundColor="Yellow"
Margin="0,10"/>
</ContentView>
</DataTemplate>
</CollectionView.HeaderTemplate>
<CollectionView.ItemTemplate>
<DataTemplate>
<Label
Text="{Binding .}"
BackgroundColor="SkyBlue"
Margin="10"
VerticalOptions="Center"
VerticalTextAlignment="Center"/>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
<Button
AutomationId="UpdateButton"
Text="Update the CollectionView header"
Clicked="Button_Clicked"/>
</VerticalStackLayout>
</ContentPage>
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Controls.Xaml;

namespace Maui.Controls.Sample.Issues
{
[XamlCompilation(XamlCompilationOptions.Compile)]
[Issue(IssueTracker.Github, 19379, "Not able to update CollectionView header", PlatformAffected.iOS)]
public partial class Issue19379 : ContentPage
{
int _initValue;
IList<string> _itemList;
Issue19379CustomHeader _customHeader;

public Issue19379()
{
InitializeComponent();
BindingContext = this;

PopulateList();
CustomHeader = new Issue19379CustomHeader
{
Title = "This is a CollectionViewHeader"
};
}

void Button_Clicked(object sender, EventArgs e)
{
_initValue++;
CustomHeader = new Issue19379CustomHeader
{
Title = $"This is a CollectionViewHeader #{_initValue}"
};
}

void PopulateList()
{
ItemList = new List<string>()
{
"This is an item",
"This is an item",
"This is an item",
"This is an item",
"This is an item",
"This is an item"
};
}

protected override void OnAppearing()
{
base.OnAppearing();
}



public IList<string> ItemList
{
get { return _itemList; }
set
{
_itemList = value;
OnPropertyChanged();
}
}

public Issue19379CustomHeader CustomHeader
{
get { return _customHeader; }
set
{
_customHeader = value;
OnPropertyChanged();
}
}
}

public class Issue19379CustomHeader
{
public string Title { get; set; }
}
}
11 changes: 1 addition & 10 deletions src/Controls/src/Core/Handlers/Items/CarouselViewHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,11 @@ public CarouselViewHandler(PropertyMapper mapper = null) : base(mapper ?? Mapper

}

public static PropertyMapper<CarouselView, CarouselViewHandler> Mapper = new PropertyMapper<CarouselView, CarouselViewHandler>(ViewMapper)
public static PropertyMapper<CarouselView, CarouselViewHandler> Mapper = new(ItemsViewMapper)
{
#if TIZEN
[Controls.CarouselView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
#endif
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
[Controls.CarouselView.IsSwipeEnabledProperty.PropertyName] = MapIsSwipeEnabled,
[Controls.CarouselView.PeekAreaInsetsProperty.PropertyName] = MapPeekAreaInsets,
[Controls.CarouselView.IsBounceEnabledProperty.PropertyName] = MapIsBounceEnabled,
Expand Down
26 changes: 1 addition & 25 deletions src/Controls/src/Core/Handlers/Items/CollectionViewHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,32 +17,8 @@ public CollectionViewHandler(PropertyMapper mapper = null) : base(mapper ?? Mapp

}

public static PropertyMapper<CollectionView, CollectionViewHandler> Mapper = new PropertyMapper<CollectionView, CollectionViewHandler>(ViewMapper)
public static PropertyMapper<CollectionView, CollectionViewHandler> Mapper = new(ReorderableItemsViewMapper)
{
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,
[GroupableItemsView.IsGroupedProperty.PropertyName] = MapIsGrouped,
#if TIZEN
[StructuredItemsView.HeaderProperty.PropertyName] = MapHeader,
[StructuredItemsView.FooterProperty.PropertyName] = MapFooter,
[GroupableItemsView.GroupFooterTemplateProperty.PropertyName] = MapIsGrouped,
[GroupableItemsView.GroupHeaderTemplateProperty.PropertyName] = MapIsGrouped,
#endif
[ReorderableItemsView.CanReorderItemsProperty.PropertyName] = MapCanReorderItems

};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,24 +17,8 @@ public GroupableItemsViewHandler(PropertyMapper mapper = null) : base(mapper ??

}

public static PropertyMapper<TItemsView, GroupableItemsViewHandler<TItemsView>> GroupableItemsViewMapper = new PropertyMapper<TItemsView, GroupableItemsViewHandler<TItemsView>>(SelectableItemsViewHandler<SelectableItemsView>.SelectableItemsViewMapper)
public static PropertyMapper<TItemsView, GroupableItemsViewHandler<TItemsView>> GroupableItemsViewMapper = new(SelectableItemsViewMapper)
{
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,
[GroupableItemsView.IsGroupedProperty.PropertyName] = MapIsGrouped,
#if WINDOWS || __ANDROID__ || TIZEN
[GroupableItemsView.GroupFooterTemplateProperty.PropertyName] = MapIsGrouped,
Expand Down
2 changes: 1 addition & 1 deletion src/Controls/src/Core/Handlers/Items/ItemsViewHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public ItemsViewHandler(PropertyMapper mapper = null) : base(mapper ?? ItemsView

}

public static PropertyMapper<TItemsView, ItemsViewHandler<TItemsView>> ItemsViewMapper = new PropertyMapper<TItemsView, ItemsViewHandler<TItemsView>>(ViewHandler.ViewMapper)
public static PropertyMapper<TItemsView, ItemsViewHandler<TItemsView>> ItemsViewMapper = new(ViewMapper)
{
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,8 @@ public ReorderableItemsViewHandler(PropertyMapper mapper = null) : base(mapper ?

}

public static PropertyMapper<TItemsView, ReorderableItemsViewHandler<TItemsView>> ReorderableItemsViewMapper = new PropertyMapper<TItemsView, ReorderableItemsViewHandler<TItemsView>>(GroupableItemsViewHandler<GroupableItemsView>.GroupableItemsViewMapper)
public static PropertyMapper<TItemsView, ReorderableItemsViewHandler<TItemsView>> ReorderableItemsViewMapper = new(GroupableItemsViewMapper)
{
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,
[GroupableItemsView.IsGroupedProperty.PropertyName] = MapIsGrouped,
#if WINDOWS || __ANDROID__
[GroupableItemsView.GroupFooterTemplateProperty.PropertyName] = MapIsGrouped,
[GroupableItemsView.GroupHeaderTemplateProperty.PropertyName] = MapIsGrouped,
#endif
[ReorderableItemsView.CanReorderItemsProperty.PropertyName] = MapCanReorderItems,
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,8 @@ public SelectableItemsViewHandler(PropertyMapper mapper = null) : base(mapper ??

}

public static PropertyMapper<TItemsView, SelectableItemsViewHandler<TItemsView>> SelectableItemsViewMapper = new PropertyMapper<TItemsView, SelectableItemsViewHandler<TItemsView>>(ViewMapper)
public static PropertyMapper<TItemsView, SelectableItemsViewHandler<TItemsView>> SelectableItemsViewMapper = new(StructuredItemsViewMapper)
{
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,
Expand Down
17 changes: 6 additions & 11 deletions src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,18 @@ public StructuredItemsViewHandler(PropertyMapper mapper = null) : base(mapper ??

}

public static PropertyMapper<TItemsView, StructuredItemsViewHandler<TItemsView>> StructuredItemsViewMapper = new PropertyMapper<TItemsView, StructuredItemsViewHandler<TItemsView>>(ViewMapper)
{
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
public static PropertyMapper<TItemsView, StructuredItemsViewHandler<TItemsView>> StructuredItemsViewMapper = new(ItemsViewMapper)
{
#if TIZEN
[StructuredItemsView.HeaderProperty.PropertyName] = MapHeader,
[StructuredItemsView.FooterProperty.PropertyName] = MapFooter,
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeader,
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooter,
#endif
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
[StructuredItemsView.HeaderProperty.PropertyName] = MapHeaderTemplate,
[StructuredItemsView.FooterProperty.PropertyName] = MapFooterTemplate,
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy
};
Expand Down
29 changes: 29 additions & 0 deletions src/Controls/tests/UITests/Tests/Issues/Issue19379.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using NUnit.Framework;
using UITest.Appium;
using UITest.Core;

namespace Microsoft.Maui.AppiumTests.Issues
{
public class Issue19379 : _IssuesUITest
{
public Issue19379(TestDevice device)
: base(device)
{ }

public override string Issue => "Not able to update CollectionView header";

[Test]
public void UpdateCollectionViewHeaderTest()
{
this.IgnoreIfPlatforms(new TestDevice[] { TestDevice.Android, TestDevice.Mac, TestDevice.Windows });

App.WaitForElement("WaitForStubControl");

// 1. Update the CollectionView Header.
App.Click("UpdateButton");

// 2. Verify the result.
VerifyScreenshot();
}
}
}
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 1138b62

Please sign in to comment.