2014-10-30 3 views
10

Sto lavorando con Xamarin.Forms e XAML e sto cercando di creare un'applicazione che memorizzi un elenco di prodotti. Inserisco il mio elenco di prodotti in un ListView. Funziona bene Qui è la mia XAML:Come disabilitare l'evidenziazione su ListView in Xamarin.Forms

<ListView x:Name="listSushi" 
     ItemsSource="{x:Static local:myListSushi.All}" 
     SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
     RowHeight="{StaticResource rowHeight}" 
     > 
<ListView.ItemTemplate> 
    <DataTemplate> 
    <ViewCell> 
     <ViewCell.View> 
     <StackLayout Padding="5, 5, 0, 5" 
        Orientation="Horizontal" 
        Spacing="15"> 
      <StackLayout> 
      <Image Source="{Binding ImageSource}" /> 
      </StackLayout> 

      <StackLayout Padding="0, 0, 0, 0" 
         VerticalOptions="Center" 
         HorizontalOptions="FillAndExpand">     
       <Label Text="{Binding Name}" 
        Font="Bold, Medium" /> 
       <Label Text="{Binding Description}" 
        Font="Small"/> 
      </StackLayout> 

      <StackLayout Orientation="Horizontal" 
         Padding="0, 0, 10, 0"> 
      <Button Text=" - " 
        HorizontalOptions="EndAndExpand" 
        VerticalOptions="FillAndExpand" 
        Command="{Binding DeleteSushiCommand}" 
        CommandParameter="{Binding Name}" 
        /> 
      <Label VerticalOptions="Center" 
        Text="{Binding Number,StringFormat='{0}'}" 
        TextColor="Black"/> 
      <Button Text=" + " 
        HorizontalOptions="EndAndExpand" 
        VerticalOptions="FillAndExpand" 
        Command="{Binding AddSushiCommand}" 
        CommandParameter="{Binding Name}" 
        /> 
      </StackLayout> 
     </StackLayout> 
     </ViewCell.View> 
    </ViewCell> 
    </DataTemplate> 
</ListView.ItemTemplate> 

ho solo il problema che se clicco su un cellula del mio listView, la cella è punto culminante, e rimanere punto culminante. Ho cerco di disabilitarlo con questo codice nelle xaml.cs

listSushi.ItemSelected+= (object sender, SelectedItemChangedEventArgs e) => { 
    // don't do anything if we just de-selected the row 
    if (e.SelectedItem == null) return; 
    // do something with e.SelectedItem 
    ((ListView)sender).SelectedItem = null; // de-select the row 
}; 

Ma quando tocco una cella, ora la mia lista scorre automaticamente. È molto strano.

Qualcuno sa se si tratta di un bug o di una correzione, ad esempio se esiste una proprietà in cui è possibile disabilitare l'evidenziazione?

+0

Se solo avessi accettato la mia risposta. ;-) –

risposta

30

Si potrebbe provare a utilizzare l'evento ItemTapped invece, vale a dire

listSushi.ItemTapped += (object sender, ItemTappedEventArgs e) => { 
    // don't do anything if we just de-selected the row 
    if (e.Item == null) return; 
    // do something with e.SelectedItem 
    ((ListView)sender).SelectedItem = null; // de-select the row 
}; 

Ho testato questo su un ListView (su un dispositivo Android), che ha elementi sufficienti per portare lo scorrimento nel mix. Non vedo alcun comportamento di scorrimento automatico e la tua idea di impostare SelectedItem null per sconfiggere l'evidenziazione funziona alla grande.

5

Suppongo che si stia utilizzando MVVM. In questi casi assegno un null alla proprietà dopo averlo usato. Nel tuo viewmodel sembra che tu abbia una proprietà SelectedItem poiché la si lega alla proprietà SelectedItem di ListView. Quindi mi sento di fare qualcosa di simile:

private Product _selectedItem; 
public Product SelectedItem 
{ 
    get 
    { 
    return _selectedItem; 
    } 
    set 
    { 
    _selectedItem = value; 

    //USE THE VALUE 

    _selectedItem = null; 
    NotifyPropertyChanged("SelectedItem"); 
    } 
} 
+2

Questa soluzione ha funzionato per me.Avevo già impostato _selectedItem = null ma non era sufficiente; l'aggiunta di NotifyPropertyChanged era la chiave (o nel mio caso, RaisePropertyChanged poiché utilizzo MVVM Light). Nota che ho anche dovuto impostare Mode = TwoWay nella vista XAML (come una proprietà per SelectedItem) affinché funzioni, anche se credo che TwoWay dovrebbe essere il valore predefinito per Mode, ho dovuto impostarlo esplicitamente. –

+1

Nel mio caso usando Prism, l'ho reso semplice come 'public RecapListViewItem SelectedRecap { get {return null; } set {OnPropertyChanged ("SelectedRecap"); } } ' –

1

Sulla soluzione del marchio iOS non ha risolto per me, ho dovuto creare un CustomRenderer per la visualizzazione elenco e l'uso che, invece.

NonSelectableListView.cs (nei moduli del progetto)

using System; 
using Xamarin.Forms; 

namespace YourProject 
{ 
    public class NonSelectableListView : ListView 
    { 
     public NonSelectableListView() 
     { 
     } 
    } 
} 

NonSelectableListViewRenderer.cs (CustomRenderer nel progetto iOS)

using Xamarin.Forms; 
using Xamarin.Forms.Platform.iOS; 

using YourProject.iOS; 
using YourProject; 

[assembly: ExportRenderer(typeof(NonSelectableListView), typeof(NonSelectableListViewRenderer))] 
namespace YourProject.iOS 
{ 
    public class NonSelectableListViewRenderer : ListViewRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) 
     { 
      base.OnElementChanged(e); 

      if (e.OldElement != null) 
      { 
       // Unsubscribe from event handlers and cleanup any resources 
      } 

      if (e.NewElement != null) 
      { 
       // Configure the native control and subscribe to event handlers 
       Control.AllowsSelection = false; 
      } 
     } 
    } 

} 
8

Ho appena trovato un altro metodo per disattivare l'effetto di evidenziazione. E mi piacerebbe condividerlo con altri utenti.

È possibile farlo direttamente su xaml. Ma questo metodo non solo disabilita l'effetto highlight, ma disabiliterà anche l'evento click.

È possibile impostare l'attributo IsEnabled di ViewCell su falso.

<ViewCell IsEnabled="false"> 
    //Your Item Layout Coding 
</ViewCell> 

Inoltre, è anche possibile abilitare/disabilitare ogni elemento effetto di evidenziazione legandosi:

<ViewCell IsEnabled="{Binding IsHighlightEnabled}"> 
    //Your Item Layout Coding 
</ViewCell> 

Speranza che aiuta, grazie.

+1

Ciò disabiliterà l'evidenziazione, ma vale la pena notare che disabiliterà anche qualsiasi evento di clic sul pulsante che potrebbe essere nel ViewCell – Nick

0
YourList.ItemSelected+=DeselectItem; 

public void DeselectItem(object sender, EventArgs e) 
    { 
    ((ListView)sender).SelectedItem = null; 
    } 

Questo dovrebbe essere utile per il tuo scenario. @dpfauwadel