--- /dev/null
+<?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
--- /dev/null
+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
new MultipleBoundSelection(), Navigation),
GalleryBuilder.NavButton("SelectionChangedCommandParameter", () =>
new SelectionChangedCommandParameter(), Navigation),
+ GalleryBuilder.NavButton("Filterable Single Selection", () =>
+ new FilterSelection(), Navigation),
}
}
};
IsSourceGrouped = false
};
}
-
+
ListViewBase.ItemsSource = _collectionViewSource.View;
}
if (ListViewBase == null)
{
ListViewBase = SelectLayout(newElement.ItemsLayout);
+ ListViewBase.IsSynchronizedWithCurrentItem = false;
_layout = newElement.ItemsLayout;
_layout.PropertyChanged += LayoutPropertyChanged;
await JumpTo(list, targetItem, args.ScrollToPosition);
}
}
-
-
-
-
}
}
\ No newline at end of file
public class SelectableItemsViewRenderer : ItemsViewRenderer
{
SelectableItemsView _selectableItemsView;
+ bool _ignoreNativeSelectionChange;
protected override void TearDownOldElement(ItemsView oldElement)
{
{
base.SetUpNewElement(newElement);
+ if (newElement == null)
+ {
+ return;
+ }
+
_selectableItemsView = newElement as SelectableItemsView;
if (_selectableItemsView != null)
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)
return item == _selectableItemsView.SelectedItem;
}
});
-
}
}
- ListViewBase.SelectionChanged += OnNativeSelectionChanged;
+
break;
case UWPListViewSelectionMode.Multiple:
- ListViewBase.SelectionChanged -= OnNativeSelectionChanged;
ListViewBase.SelectedItems.Clear();
foreach (var nativeItem in ListViewBase.Items)
{
ListViewBase.SelectedItems.Add(nativeItem);
}
}
- ListViewBase.SelectionChanged += OnNativeSelectionChanged;
break;
case UWPListViewSelectionMode.Extended:
break;
break;
}
+ _ignoreNativeSelectionChange = false;
}
void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
void OnNativeSelectionChanged(object sender, Windows.UI.Xaml.Controls.SelectionChangedEventArgs e)
{
+ if (_ignoreNativeSelectionChange)
+ {
+ return;
+ }
+
if (Element is SelectableItemsView selectableItemsView)
{
switch (ListViewBase.SelectionMode)