Skip to content

Commit 1138b62

Browse files
kubaflojsuarezruizrmarinho
authored
[iOS] Fixed Collection View header and footer update (#20210)
* Fixed Collection View header and footer update [iOS] (#19379) * Added UITest * Added pending snapshot * [iOS] Correctly fix the CollectionView mappers hierarchy --------- Co-authored-by: [email protected] <[email protected]> Co-authored-by: Rui Marinho <[email protected]>
1 parent 75be404 commit 1138b62

File tree

11 files changed

+164
-100
lines changed

11 files changed

+164
-100
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
3+
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
4+
x:Class="Maui.Controls.Sample.Issues.Issue19379"
5+
xmlns:ns="clr-namespace:Maui.Controls.Sample.Issues">
6+
<VerticalStackLayout
7+
Padding="30,0"
8+
Spacing="25">
9+
<Label
10+
AutomationId="WaitForStubControl"
11+
Text="Issue 19379"/>
12+
<CollectionView
13+
Header="{Binding CustomHeader, Mode=TwoWay}"
14+
ItemsSource="{Binding ItemList}">
15+
<CollectionView.HeaderTemplate>
16+
<DataTemplate>
17+
<ContentView>
18+
<Label
19+
Text="{Binding Title}"
20+
BackgroundColor="Yellow"
21+
Margin="0,10"/>
22+
</ContentView>
23+
</DataTemplate>
24+
</CollectionView.HeaderTemplate>
25+
<CollectionView.ItemTemplate>
26+
<DataTemplate>
27+
<Label
28+
Text="{Binding .}"
29+
BackgroundColor="SkyBlue"
30+
Margin="10"
31+
VerticalOptions="Center"
32+
VerticalTextAlignment="Center"/>
33+
</DataTemplate>
34+
</CollectionView.ItemTemplate>
35+
</CollectionView>
36+
<Button
37+
AutomationId="UpdateButton"
38+
Text="Update the CollectionView header"
39+
Clicked="Button_Clicked"/>
40+
</VerticalStackLayout>
41+
</ContentPage>
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Microsoft.Maui.Controls;
4+
using Microsoft.Maui.Controls.Xaml;
5+
6+
namespace Maui.Controls.Sample.Issues
7+
{
8+
[XamlCompilation(XamlCompilationOptions.Compile)]
9+
[Issue(IssueTracker.Github, 19379, "Not able to update CollectionView header", PlatformAffected.iOS)]
10+
public partial class Issue19379 : ContentPage
11+
{
12+
int _initValue;
13+
IList<string> _itemList;
14+
Issue19379CustomHeader _customHeader;
15+
16+
public Issue19379()
17+
{
18+
InitializeComponent();
19+
BindingContext = this;
20+
21+
PopulateList();
22+
CustomHeader = new Issue19379CustomHeader
23+
{
24+
Title = "This is a CollectionViewHeader"
25+
};
26+
}
27+
28+
void Button_Clicked(object sender, EventArgs e)
29+
{
30+
_initValue++;
31+
CustomHeader = new Issue19379CustomHeader
32+
{
33+
Title = $"This is a CollectionViewHeader #{_initValue}"
34+
};
35+
}
36+
37+
void PopulateList()
38+
{
39+
ItemList = new List<string>()
40+
{
41+
"This is an item",
42+
"This is an item",
43+
"This is an item",
44+
"This is an item",
45+
"This is an item",
46+
"This is an item"
47+
};
48+
}
49+
50+
protected override void OnAppearing()
51+
{
52+
base.OnAppearing();
53+
}
54+
55+
56+
57+
public IList<string> ItemList
58+
{
59+
get { return _itemList; }
60+
set
61+
{
62+
_itemList = value;
63+
OnPropertyChanged();
64+
}
65+
}
66+
67+
public Issue19379CustomHeader CustomHeader
68+
{
69+
get { return _customHeader; }
70+
set
71+
{
72+
_customHeader = value;
73+
OnPropertyChanged();
74+
}
75+
}
76+
}
77+
78+
public class Issue19379CustomHeader
79+
{
80+
public string Title { get; set; }
81+
}
82+
}

src/Controls/src/Core/Handlers/Items/CarouselViewHandler.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,11 @@ public CarouselViewHandler(PropertyMapper mapper = null) : base(mapper ?? Mapper
1212

1313
}
1414

15-
public static PropertyMapper<CarouselView, CarouselViewHandler> Mapper = new PropertyMapper<CarouselView, CarouselViewHandler>(ViewMapper)
15+
public static PropertyMapper<CarouselView, CarouselViewHandler> Mapper = new(ItemsViewMapper)
1616
{
1717
#if TIZEN
1818
[Controls.CarouselView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
1919
#endif
20-
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
21-
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
22-
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
23-
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
24-
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
25-
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
26-
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
27-
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
28-
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
2920
[Controls.CarouselView.IsSwipeEnabledProperty.PropertyName] = MapIsSwipeEnabled,
3021
[Controls.CarouselView.PeekAreaInsetsProperty.PropertyName] = MapPeekAreaInsets,
3122
[Controls.CarouselView.IsBounceEnabledProperty.PropertyName] = MapIsBounceEnabled,

src/Controls/src/Core/Handlers/Items/CollectionViewHandler.cs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,8 @@ public CollectionViewHandler(PropertyMapper mapper = null) : base(mapper ?? Mapp
1717

1818
}
1919

20-
public static PropertyMapper<CollectionView, CollectionViewHandler> Mapper = new PropertyMapper<CollectionView, CollectionViewHandler>(ViewMapper)
20+
public static PropertyMapper<CollectionView, CollectionViewHandler> Mapper = new(ReorderableItemsViewMapper)
2121
{
22-
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
23-
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
24-
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
25-
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
26-
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
27-
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
28-
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
29-
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
30-
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
31-
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
32-
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
33-
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
34-
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
35-
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
36-
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
37-
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,
38-
[GroupableItemsView.IsGroupedProperty.PropertyName] = MapIsGrouped,
39-
#if TIZEN
40-
[StructuredItemsView.HeaderProperty.PropertyName] = MapHeader,
41-
[StructuredItemsView.FooterProperty.PropertyName] = MapFooter,
42-
[GroupableItemsView.GroupFooterTemplateProperty.PropertyName] = MapIsGrouped,
43-
[GroupableItemsView.GroupHeaderTemplateProperty.PropertyName] = MapIsGrouped,
44-
#endif
45-
[ReorderableItemsView.CanReorderItemsProperty.PropertyName] = MapCanReorderItems
4622

4723
};
4824
}

src/Controls/src/Core/Handlers/Items/GroupableItemsViewHandler.cs

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,8 @@ public GroupableItemsViewHandler(PropertyMapper mapper = null) : base(mapper ??
1717

1818
}
1919

20-
public static PropertyMapper<TItemsView, GroupableItemsViewHandler<TItemsView>> GroupableItemsViewMapper = new PropertyMapper<TItemsView, GroupableItemsViewHandler<TItemsView>>(SelectableItemsViewHandler<SelectableItemsView>.SelectableItemsViewMapper)
20+
public static PropertyMapper<TItemsView, GroupableItemsViewHandler<TItemsView>> GroupableItemsViewMapper = new(SelectableItemsViewMapper)
2121
{
22-
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
23-
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
24-
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
25-
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
26-
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
27-
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
28-
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
29-
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
30-
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
31-
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
32-
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
33-
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
34-
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
35-
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
36-
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
37-
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,
3822
[GroupableItemsView.IsGroupedProperty.PropertyName] = MapIsGrouped,
3923
#if WINDOWS || __ANDROID__ || TIZEN
4024
[GroupableItemsView.GroupFooterTemplateProperty.PropertyName] = MapIsGrouped,

src/Controls/src/Core/Handlers/Items/ItemsViewHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public ItemsViewHandler(PropertyMapper mapper = null) : base(mapper ?? ItemsView
1818

1919
}
2020

21-
public static PropertyMapper<TItemsView, ItemsViewHandler<TItemsView>> ItemsViewMapper = new PropertyMapper<TItemsView, ItemsViewHandler<TItemsView>>(ViewHandler.ViewMapper)
21+
public static PropertyMapper<TItemsView, ItemsViewHandler<TItemsView>> ItemsViewMapper = new(ViewMapper)
2222
{
2323
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
2424
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,

src/Controls/src/Core/Handlers/Items/ReorderableItemsViewHandler.cs

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,8 @@ public ReorderableItemsViewHandler(PropertyMapper mapper = null) : base(mapper ?
1717

1818
}
1919

20-
public static PropertyMapper<TItemsView, ReorderableItemsViewHandler<TItemsView>> ReorderableItemsViewMapper = new PropertyMapper<TItemsView, ReorderableItemsViewHandler<TItemsView>>(GroupableItemsViewHandler<GroupableItemsView>.GroupableItemsViewMapper)
20+
public static PropertyMapper<TItemsView, ReorderableItemsViewHandler<TItemsView>> ReorderableItemsViewMapper = new(GroupableItemsViewMapper)
2121
{
22-
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
23-
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
24-
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
25-
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
26-
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
27-
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
28-
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
29-
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
30-
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
31-
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
32-
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
33-
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
34-
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
35-
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
36-
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
37-
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,
38-
[GroupableItemsView.IsGroupedProperty.PropertyName] = MapIsGrouped,
39-
#if WINDOWS || __ANDROID__
40-
[GroupableItemsView.GroupFooterTemplateProperty.PropertyName] = MapIsGrouped,
41-
[GroupableItemsView.GroupHeaderTemplateProperty.PropertyName] = MapIsGrouped,
42-
#endif
4322
[ReorderableItemsView.CanReorderItemsProperty.PropertyName] = MapCanReorderItems,
4423
};
4524
}

src/Controls/src/Core/Handlers/Items/SelectableItemsViewHandler.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,8 @@ public SelectableItemsViewHandler(PropertyMapper mapper = null) : base(mapper ??
1818

1919
}
2020

21-
public static PropertyMapper<TItemsView, SelectableItemsViewHandler<TItemsView>> SelectableItemsViewMapper = new PropertyMapper<TItemsView, SelectableItemsViewHandler<TItemsView>>(ViewMapper)
21+
public static PropertyMapper<TItemsView, SelectableItemsViewHandler<TItemsView>> SelectableItemsViewMapper = new(StructuredItemsViewMapper)
2222
{
23-
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
24-
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
25-
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
26-
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
27-
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
28-
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
29-
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
30-
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
31-
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
32-
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
33-
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
34-
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
35-
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy,
3623
[SelectableItemsView.SelectedItemProperty.PropertyName] = MapSelectedItem,
3724
[SelectableItemsView.SelectedItemsProperty.PropertyName] = MapSelectedItems,
3825
[SelectableItemsView.SelectionModeProperty.PropertyName] = MapSelectionMode,

src/Controls/src/Core/Handlers/Items/StructuredItemsViewHandler.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,18 @@ public StructuredItemsViewHandler(PropertyMapper mapper = null) : base(mapper ??
1717

1818
}
1919

20-
public static PropertyMapper<TItemsView, StructuredItemsViewHandler<TItemsView>> StructuredItemsViewMapper = new PropertyMapper<TItemsView, StructuredItemsViewHandler<TItemsView>>(ViewMapper)
21-
{
22-
[Controls.ItemsView.ItemsSourceProperty.PropertyName] = MapItemsSource,
23-
[Controls.ItemsView.HorizontalScrollBarVisibilityProperty.PropertyName] = MapHorizontalScrollBarVisibility,
24-
[Controls.ItemsView.VerticalScrollBarVisibilityProperty.PropertyName] = MapVerticalScrollBarVisibility,
25-
[Controls.ItemsView.ItemTemplateProperty.PropertyName] = MapItemTemplate,
26-
[Controls.ItemsView.EmptyViewProperty.PropertyName] = MapEmptyView,
27-
[Controls.ItemsView.EmptyViewTemplateProperty.PropertyName] = MapEmptyViewTemplate,
28-
[Controls.ItemsView.FlowDirectionProperty.PropertyName] = MapFlowDirection,
29-
[Controls.ItemsView.IsVisibleProperty.PropertyName] = MapIsVisible,
30-
[Controls.ItemsView.ItemsUpdatingScrollModeProperty.PropertyName] = MapItemsUpdatingScrollMode,
20+
public static PropertyMapper<TItemsView, StructuredItemsViewHandler<TItemsView>> StructuredItemsViewMapper = new(ItemsViewMapper)
21+
{
3122
#if TIZEN
3223
[StructuredItemsView.HeaderProperty.PropertyName] = MapHeader,
3324
[StructuredItemsView.FooterProperty.PropertyName] = MapFooter,
25+
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeader,
26+
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooter,
3427
#endif
3528
[StructuredItemsView.HeaderTemplateProperty.PropertyName] = MapHeaderTemplate,
3629
[StructuredItemsView.FooterTemplateProperty.PropertyName] = MapFooterTemplate,
30+
[StructuredItemsView.HeaderProperty.PropertyName] = MapHeaderTemplate,
31+
[StructuredItemsView.FooterProperty.PropertyName] = MapFooterTemplate,
3732
[StructuredItemsView.ItemsLayoutProperty.PropertyName] = MapItemsLayout,
3833
[StructuredItemsView.ItemSizingStrategyProperty.PropertyName] = MapItemSizingStrategy
3934
};
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using NUnit.Framework;
2+
using UITest.Appium;
3+
using UITest.Core;
4+
5+
namespace Microsoft.Maui.AppiumTests.Issues
6+
{
7+
public class Issue19379 : _IssuesUITest
8+
{
9+
public Issue19379(TestDevice device)
10+
: base(device)
11+
{ }
12+
13+
public override string Issue => "Not able to update CollectionView header";
14+
15+
[Test]
16+
public void UpdateCollectionViewHeaderTest()
17+
{
18+
this.IgnoreIfPlatforms(new TestDevice[] { TestDevice.Android, TestDevice.Mac, TestDevice.Windows });
19+
20+
App.WaitForElement("WaitForStubControl");
21+
22+
// 1. Update the CollectionView Header.
23+
App.Click("UpdateButton");
24+
25+
// 2. Verify the result.
26+
VerifyScreenshot();
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)