2016-05-23 2 views
2

J'utilise un élément ListView dans mon XAML:Faire élément ListView spécifique non cliquable dans Windows plate-forme universelle

   <ListView 
       x:Name="myList" 
       IsItemClickEnabled="true" 
       ItemClick="onDrawerItemClick" 
       SelectionMode="Single" 
       ScrollViewer.VerticalScrollBarVisibility="Hidden"> 

       <ListView.ItemTemplate> 
        <DataTemplate> 

         <Grid 
          Width="260"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition 
            Width="44" /> 
           <ColumnDefinition 
            Width="*" /> 
          </Grid.ColumnDefinitions> 

          <Image 
           x:Name="image" 
           Source="{Binding myIcon}" 
           Grid.Column="0" /> 

          <TextBlock 
           Text="{Binding myTxt}" 
           Grid.Column="1" /> 

         </Grid> 

        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 

et je l'alimenter en utilisant la propriété Bind comme ceci:

List<MyObj> listData = a list with title + image uri; 
myList.ItemsSource = listData; 

Je dois Désactiver le clic uniquement pour certains éléments en fonction de la valeur de MyObj dans ma liste mais les autres pour l'avoir. Dans Android, nous utilisons un adaptateur pour cela, comment dois-je le gérer ici?

+0

référez-vous à ce lien http://stackoverflow.com/questions/37132267/disable-certain-listviewitem-depending-on-custom-property-uwp/37133619#37133619 – Archana

Répondre

5

Tout d'abord, vous devez créer une nouvelle propriété bool appelée Disabled à l'intérieur de votre objet MyObj.

Alors, abonnez-vous à l'événement de ContainerContentChangingmyList où vous avez accès à ListViewItem et son correspondant Item, qui dans ce cas est votre MyObj. Donc, si MyObj.Disabled est true, faites que ListViewItem non-cliquable.

private void myList_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args) 
{ 
    var listViewItem = args.ItemContainer; 

    if (listViewItem != null) 
    { 
     var model = (MyObj)args.Item; 

     if (model.Disabled) 
     { 
      listViewItem.IsHitTestVisible = false; 

      // OR 
      //listViewItem.IsEnabled = false; 
     } 
    } 
} 

Gardez à l'esprit que vous pouvez utiliser listViewItem.IsEnabled = false si vous voulez cet élément également apparaître estompé. Cela est dû au fait que le style ListViewItem par défaut a un état désactivé qui réduit son Opacity; alors que le réglage listViewItem.IsHitTestVisible = false ne changera en rien son apparence.

0

Le listView est un contrôle étrange car il ne dispose d'aucun mécanisme pour désactiver la sélection.

Donc ce que je vous suggère de faire est gérer plutôt l'événement qui informe le cadre qu'un élément a été sélectionné en attachant un gestionnaire d'événements à ItemSelectionChanged et y effectuer une deselect sur l'article:

yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged; 

private void yourListView_ItemSelectionChanged(
    object sender, 
    ListViewItemSelectionChangedEventArgs e) 
{ 
    if (e.IsSelected) 
     e.Item.Selected = false; 
} 

S'il vous plaît laissez-moi savoir si ma réponse aide :)