Search code examples
c#windows-store-appswinrt-xamlwindows-8.1-universal

How to make some ListView items 'greyed-out' and unselectable?


Some items in the ListView control will be selectable and have normal text. Some items however, although included in the ListView as items, will be unselectable/unclickable and 'greyed-out'.

In Windows-Store-Apps we have the ability to select Single/Multiple/None items in a ListView. But how can make certain items at certain indexes unselectable/unclickable and 'greyed-out', in code mainly?

I managed to access the Item of the ListView at a certain index:

myListView.ItemContainerGenerator.ContainerFromIndex(i)

But I couldn't find any option to customize its selected event handler. Any idea how to achieve that?


Solution

  • I have found a solution:

    I have override the ListView control and create a StripedListView. Then by overriding the PrepareContainerForItemOverride, which is responsible for the setting up the ListViewItem control after it’s be created, you could modify the background color and set the ItemListView.isEnabled option to false:

    public class StripedListView : ListView
        {          
            protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
            {
                base.PrepareContainerForItemOverride(element, item);
                var listViewItem = element as ListViewItem;
                if (listViewItem != null)
                {
                    var index = IndexFromContainer(element);
    
                    if (Words.arrayW[index].Length > 0)
                    {
                        listViewItem.Foreground = new SolidColorBrush(Colors.Black);
    
                    }
                    else
                    {
                        listViewItem.Foreground = new SolidColorBrush(Colors.Gray); 
                        listViewItem.IsEnabled = false;
                    }
                }
            }
        }
    

    In Xaml:

    <controls:StripedListView x:Name="letterListView" ItemsSource="{Binding}">   
          <controls:StripedListView.ItemTemplate>  
             <DataTemplate>                           
                    etc...              
             </DataTemplate>
          </controls:StripedListView.ItemTemplate>
    </controls:StripedListView>