Search code examples
xamllistviewxamarinxamarin.formshighlight

Keep highlighting the cell when user deselect


I'm using Xamarin Forms ListView as a SideBar. How can I prevent users from deselecting cell? Or at least keep highlighting the cell when users deselect it. This is how I'm binding


                   <ListView x:Name="listView" SelectionMode="Single">
                        <ListView.ItemsSource>
                            <x:Array Type="{x:Type x:String}">
                                <x:String>Management</x:String>
                                <x:String>Information</x:String>
                                <x:String>Language</x:String>
                                <x:String>Settings</x:String>
                            </x:Array>
                        </ListView.ItemsSource>
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <TextCell Text="{Binding}" />
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>

Solution

  • According to your description, when you select item from ListView, this item highlighting, you want to this item still highlighting when this item is not selected state. It seems that you want to select multiple item from ListView.

    I've made a sample, you can take a look:

     <ContentPage.Content>
        <StackLayout>
            <ListView
                ItemTapped="ListView_ItemTapped"
                ItemsSource="{Binding Items}"
                SelectionMode="Single">
    
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout BackgroundColor="{Binding background}" Orientation="Horizontal">
                                <Label
                                    HorizontalOptions="StartAndExpand"
                                    Text="{Binding DisplayName}"
                                    TextColor="Fuchsia" />
                                <BoxView
                                    HorizontalOptions="End"
                                    IsVisible="{Binding Selected}"
                                    Color="Fuchsia" />
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    </ContentPage.Content>
    
    public partial class Page10 : ContentPage
    {
        public Page10 ()
        {
            InitializeComponent ();
            this.BindingContext = new MultiSelectItemsViewModel();
        }
    
        private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            Model m = e.Item as Model;
    
            if(m!=null)
            {
                m.Selected = !m.Selected;
                if(m.background==Color.White)
                {
                    m.background = Color.BlueViolet;
                }
                else
                {
                    m.background = Color.White;
                }
            }
    
        }
    }
    
    public class Model:ViewModelBase
    {
        public string DisplayName { get; set; }
        private bool _Selected;
       
        public bool Selected
        {
            get { return _Selected; }
            set
            {
                _Selected = value;
                RaisePropertyChanged("Selected");
            }
        }
        private Color _background;
        public Color background
        {
            get { return _background; }
            set
            {
                _background = value;
                RaisePropertyChanged("background");
            }
        }
    }
    
    public class MultiSelectItemsViewModel
    {
        public ObservableCollection<Model> Items { get; set; }
        
    
        public MultiSelectItemsViewModel()
        {
            Items = new ObservableCollection<Model>();
            Items.Add(new Model() { DisplayName = "AAA", Selected = false,background=Color.White });
            Items.Add(new Model() { DisplayName = "BBB", Selected = false , background = Color.White });
            Items.Add(new Model() { DisplayName = "CCC", Selected = false, background = Color.White });
            Items.Add(new Model() { DisplayName = "DDD", Selected = false, background = Color.White });
            Items.Add(new Model() { DisplayName = "EEE", Selected = false, background = Color.White });
          
        }
    
       
    }
    

    enter image description here

    Update:

    Don't allow user to unselect the selected item.

     private void ListView_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            Model m = e.Item as Model;
    
            if(m!=null)
            {
                m.Selected = true;
                m.background = Color.Blue;
    
                
            }
    
        }