Disable UWP CollectionViewSource CurrentItem synchronization (#7267) fixes #7194
authorE.Z. Hart <hartez@users.noreply.github.com>
Tue, 27 Aug 2019 13:59:56 +0000 (07:59 -0600)
committerRui Marinho <me@ruimarinho.net>
Tue, 27 Aug 2019 13:59:56 +0000 (14:59 +0100)
* Disable UWP CollectionViewSource CurrentItem synchronization
Fixes #7194

* Remove unnecessary stuff from test page

Xamarin.Forms.Controls/GalleryPages/CollectionViewGalleries/SelectionGalleries/FilterSelection.xaml [new file with mode: 0644]
Xamarin.Forms.Controls/GalleryPages/CollectionViewGalleries/SelectionGalleries/FilterSelection.xaml.cs [new file with mode: 0644]
Xamarin.Forms.Controls/GalleryPages/CollectionViewGalleries/SelectionGalleries/SelectionGallery.cs
Xamarin.Forms.Platform.UAP/CollectionView/ItemsViewRenderer.cs
Xamarin.Forms.Platform.UAP/CollectionView/SelectableItemsViewRenderer.cs

diff --git a/Xamarin.Forms.Controls/GalleryPages/CollectionViewGalleries/SelectionGalleries/FilterSelection.xaml b/Xamarin.Forms.Controls/GalleryPages/CollectionViewGalleries/SelectionGalleries/FilterSelection.xaml
new file mode 100644 (file)
index 0000000..bc0b43f
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+             mc:Ignorable="d"
+             x:Class="Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.SelectionGalleries.FilterSelection">
+    <ContentPage.Content>
+        <Grid>
+            <Grid.RowDefinitions>
+                <RowDefinition Height="Auto"></RowDefinition>
+                <RowDefinition Height="Auto"></RowDefinition>
+                <RowDefinition Height="Auto"></RowDefinition>
+                <RowDefinition Height="*"></RowDefinition>
+            </Grid.RowDefinitions>
+
+            <Label Text="Select an item in the CollectionView below. Tap the Reset button to change the ItemsSource. The item should no longer be selected. If an item is still selected, this test has failed."/>
+
+            <SearchBar x:Name="SearchBar" Placeholder="Filter" Grid.Row="1" />
+
+            <Button x:Name="ResetButton" Text="Reset" Grid.Row="2" AutomationId="Reset" />
+
+            <CollectionView x:Name="CollectionView" Grid.Row="3" SelectionMode="Single">
+                <CollectionView.ItemTemplate>
+                    <DataTemplate>
+                        <Label Text="{Binding Caption}"/>
+                    </DataTemplate>
+                </CollectionView.ItemTemplate>
+            </CollectionView>
+        </Grid>
+    </ContentPage.Content>
+</ContentPage>
\ No newline at end of file
diff --git a/Xamarin.Forms.Controls/GalleryPages/CollectionViewGalleries/SelectionGalleries/FilterSelection.xaml.cs b/Xamarin.Forms.Controls/GalleryPages/CollectionViewGalleries/SelectionGalleries/FilterSelection.xaml.cs
new file mode 100644 (file)
index 0000000..9d2e3c9
--- /dev/null
@@ -0,0 +1,31 @@
+using System;
+using Xamarin.Forms.Xaml;
+
+namespace Xamarin.Forms.Controls.GalleryPages.CollectionViewGalleries.SelectionGalleries
+{
+       [XamlCompilation(XamlCompilationOptions.Compile)]
+       public partial class FilterSelection : ContentPage
+       {
+               DemoFilteredItemSource _demoFilteredItemSource = new DemoFilteredItemSource();
+
+               public FilterSelection()
+               {
+                       InitializeComponent();
+
+                       CollectionView.ItemsSource = _demoFilteredItemSource.Items;
+
+                       SearchBar.SearchCommand = new Command(() =>
+                       {
+                               _demoFilteredItemSource.FilterItems(SearchBar.Text);
+                       });
+
+                       ResetButton.Clicked += ResetButtonClicked;
+               }
+
+               void ResetButtonClicked(object sender, EventArgs e)
+               {
+                       _demoFilteredItemSource = new DemoFilteredItemSource(new Random().Next(3, 50));
+                       CollectionView.ItemsSource = _demoFilteredItemSource.Items;
+               }
+       }
+}
\ No newline at end of file
index 12c4ccc..711cf5e 100644 (file)
@@ -28,6 +28,8 @@
                                                        new MultipleBoundSelection(), Navigation),
                                                GalleryBuilder.NavButton("SelectionChangedCommandParameter", () =>
                                                        new SelectionChangedCommandParameter(), Navigation),
+                                               GalleryBuilder.NavButton("Filterable Single Selection", () =>
+                                                       new FilterSelection(), Navigation),
                                        }
                                }
                        };
index 8829f0a..9148c6e 100644 (file)
@@ -124,7 +124,7 @@ namespace Xamarin.Forms.Platform.UWP
                                        IsSourceGrouped = false
                                };
                        }
-
+                       
                        ListViewBase.ItemsSource = _collectionViewSource.View;
                }
 
@@ -323,6 +323,7 @@ namespace Xamarin.Forms.Platform.UWP
                        if (ListViewBase == null)
                        {
                                ListViewBase = SelectLayout(newElement.ItemsLayout);
+                               ListViewBase.IsSynchronizedWithCurrentItem = false;
 
                                _layout = newElement.ItemsLayout;
                                _layout.PropertyChanged += LayoutPropertyChanged;
@@ -546,9 +547,5 @@ namespace Xamarin.Forms.Platform.UWP
                                await JumpTo(list, targetItem, args.ScrollToPosition);
                        }
                }
-
-               
-
-               
        }
 }
\ No newline at end of file
index 132f5a0..9c21980 100644 (file)
@@ -9,6 +9,7 @@ namespace Xamarin.Forms.Platform.UWP
        public class SelectableItemsViewRenderer : ItemsViewRenderer
        {
                SelectableItemsView _selectableItemsView;
+               bool _ignoreNativeSelectionChange;
 
                protected override void TearDownOldElement(ItemsView oldElement)
                {
@@ -31,6 +32,11 @@ namespace Xamarin.Forms.Platform.UWP
                {
                        base.SetUpNewElement(newElement);
 
+                       if (newElement == null)
+                       {
+                               return;
+                       }
+
                        _selectableItemsView = newElement as SelectableItemsView;
 
                        if (_selectableItemsView != null)
@@ -57,14 +63,24 @@ namespace Xamarin.Forms.Platform.UWP
                        UpdateNativeSelection();
                }
 
+               protected override void UpdateItemsSource()
+               {
+                       _ignoreNativeSelectionChange = true;
+
+                       base.UpdateItemsSource();
+
+                       _ignoreNativeSelectionChange = false;
+               }
+
                void UpdateNativeSelection()
                {
+                       _ignoreNativeSelectionChange = true;
+
                        switch (ListViewBase.SelectionMode)
                        {
                                case UWPListViewSelectionMode.None:
                                        break;
                                case UWPListViewSelectionMode.Single:
-                                       ListViewBase.SelectionChanged -= OnNativeSelectionChanged;
                                        if (_selectableItemsView != null)
                                        {
                                                if (_selectableItemsView.SelectedItem == null)
@@ -85,13 +101,11 @@ namespace Xamarin.Forms.Platform.UWP
                                                                                return item == _selectableItemsView.SelectedItem;
                                                                        }
                                                                });
-                                                                       
                                                }
                                        }
-                                       ListViewBase.SelectionChanged += OnNativeSelectionChanged;
+                                       
                                        break;
                                case UWPListViewSelectionMode.Multiple:
-                                       ListViewBase.SelectionChanged -= OnNativeSelectionChanged;
                                        ListViewBase.SelectedItems.Clear();
                                        foreach (var nativeItem in ListViewBase.Items)
                                        {
@@ -104,7 +118,6 @@ namespace Xamarin.Forms.Platform.UWP
                                                        ListViewBase.SelectedItems.Add(nativeItem);
                                                }
                                        }
-                                       ListViewBase.SelectionChanged += OnNativeSelectionChanged;
                                        break;
                                case UWPListViewSelectionMode.Extended:
                                        break;
@@ -112,6 +125,7 @@ namespace Xamarin.Forms.Platform.UWP
                                        break;
                        }
 
+                       _ignoreNativeSelectionChange = false;
                }
 
                void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
@@ -121,6 +135,11 @@ namespace Xamarin.Forms.Platform.UWP
 
                void OnNativeSelectionChanged(object sender, Windows.UI.Xaml.Controls.SelectionChangedEventArgs e)
                {
+                       if (_ignoreNativeSelectionChange)
+                       {
+                               return;
+                       }
+
                        if (Element is SelectableItemsView selectableItemsView)
                        {
                                switch (ListViewBase.SelectionMode)