wake-up-neo.com

Deaktivieren der Hervorhebung in ListView in Xamarin.Forms

Ich arbeite mit Xamarin.Forms und XAML und versuche, eine Anwendung zu erstellen, in der eine Liste von Produkten gespeichert ist. Ich habe meine Produktliste in einer ListView abgelegt. Das funktioniert gut. Hier ist meine XAML:

<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>

Ich habe nur das Problem, dass wenn ich auf eine Zelle meiner ListView klicke, die Zelle hervorgehoben wird und hervorgehoben bleibt. Ich habe versucht, es mit diesem Code in der xaml.cs zu deaktivieren

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
};

Wenn ich aber eine Zelle berühre, läuft meine Liste automatisch weiter. Es ist sehr seltsam.

Weiß jemand, ob es sich um einen Fehler handelt oder ob es sich um eine Fehlerbehebung handelt, z. B. um eine Eigenschaft, in der ich die Hervorhebung deaktivieren kann?

22
dpfauwadel

Sie können stattdessen versuchen, das ItemTapped-Ereignis zu verwenden, d. H.

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

    // Optionally pause a bit to allow the preselect hint.
    Task.Delay(500);

    // Deselect the item.
    if (sender is ListView lv) lv.SelectedItem = null;

    // Do something with the selection.
    ...
};

Ich habe dies auf einem ListView (auf einem Android Gerät)) getestet, das über genügend Elemente verfügt, um das Scrollen in den Mix zu bringen. Ich sehe kein Verhalten beim automatischen Scrollen und Ihre Idee, SelectedItem auf null zu setzen, ist hinfällig Das Highlight funktioniert super.

45
Mark Larter

Ich habe gerade eine andere Methode gefunden, um den Hervorhebungseffekt zu deaktivieren. Und ich möchte dies mit anderen Benutzern teilen.

Sie können dies direkt bei xaml tun. Diese Methode deaktiviert jedoch nicht nur den Hervorhebungseffekt, sondern auch das Klickereignis.

Sie können das IsEnabled-Attribut von ViewCell auf false setzen.

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

Außerdem können Sie jeden Elementhervorhebungseffekt durch Binden deaktivieren/aktivieren:

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

Hoffe das hilft, danke.

17
Sonny Ng

Aktuell können wir ListView.SelectionMode auf None setzen, um dies zu tun. https://docs.Microsoft.com/en-us/xamarin/xamarin-forms/user-interface/listview/interactivity

9
Jesse Jiang
YourList.ItemSelected+=DeselectItem;

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

Dies sollte für Ihr Szenario hilfreich sein. @dpfauwadel

7
Riyas

Ich gehe davon aus, dass Sie MVVM verwenden. In diesen Fällen weise ich der Eigenschaft nach der Verwendung eine Null zu. In Ihrem Ansichtsmodell scheint eine SelectedItem-Eigenschaft vorhanden zu sein, da Sie diese an die SelectedItem-Eigenschaft der ListView binden. Also würde ich so etwas machen:

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

    //USE THE VALUE

    _selectedItem = null;
    NotifyPropertyChanged("SelectedItem");
  }
}
6
jgarza

Da die Lösung von iOS mark es für mich nicht gelöst hat, musste ich einen CustomRenderer für die Listenansicht erstellen und diesen stattdessen verwenden.

NonSelectableListView.cs (in Ihrem Formularprojekt)

using System;
using Xamarin.Forms;

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

NonSelectableListViewRenderer.cs (CustomRenderer in Ihrem iOS-Projekt)

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;
            }
        }
    }

}
4
RobVoisey