ListView ItemClick не работает в Xamarin.Forms (iOS)

У нас есть пользовательский ListView, у которого есть свойство ItemClickCommand. Мы связываем это в файле XAML с помощью ключевого слова local. Он отлично работает для Xamarin.Forms Android, но не доступен в Xamarin.forms iOS.

Пожалуйста, подскажите, что делать или что мы делаем не так в коде.

Код написан ниже:

XAML файл:

<StackLayout x:Class="XYZ"
         xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:local="clr-namespace:XYZ.UI;assembly=XYZ">

            <local:ListView ItemClickCommand="{Binding OnDataSelectionCommand, Mode=TwoWay}" ItemsSource="{Binding DataList}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>

                            <StackLayout Orientation="Horizontal">
                                <Label FontSize="17"
                                       HorizontalOptions="Start"
                                       Text="{Binding }"
                                       TextColor="Black"
                                       VerticalOptions="Center" />


                                <Label FontSize="17"
                                       HorizontalOptions="Start"
                                       Text=" , "
                                       TextColor="Black"
                                       VerticalOptions="Center" />


                            </StackLayout>
                        </ViewCell>

                    </DataTemplate>
                </ListView.ItemTemplate>
            </local:ListView>

View Model :

private Command _onDataSelectionCommand;
public Command OnDataSelectionCommand
{
      get
      {
           return _onDataSelectionCommand ?? (_onDataSelectionCommand = new Command(async (s) =>
           {
                // TODO: get selected item from list !!
           }));
       }
}

Создан настраиваемый список:

  using System.Windows.Input;
  using Xamarin.Forms;         
  namespace XYZ.UI
  {     

    public class ListView : Xamarin.Forms.ListView
   {
    public static BindableProperty ItemClickCommandProperty = BindableProperty.Create<ListView, ICommand>(x => x.ItemClickCommand, null);

    public ListView()
    {
        this.ItemTapped += this.OnItemTapped;
    }

    public ICommand ItemClickCommand
    {
        get { return (ICommand)this.GetValue(ItemClickCommandProperty); }
        set { this.SetValue(ItemClickCommandProperty, value); }
    }

    private void OnItemTapped(object sender, ItemTappedEventArgs e)
    {
        if (e.Item != null && this.ItemClickCommand != null && this.ItemClickCommand.CanExecute(e))
        {
            this.ItemClickCommand.Execute(e.Item);
        }
    }
  }

person Pooja Rawat    schedule 03.08.2016    source источник


Ответы (1)


Вы должны использовать свойство SelectedItem ListView для привязки. Это даст вам объект (элемент) коллекции, которую вы связали со списком.

Образец проекта можно найти здесь.

Также обратите внимание, что ItemTapped не то же самое, что ItemSelected.

Если вас интересует привязка команды к элементу ListView Tapped, ознакомьтесь с тем же сообщением на форуме - Как привязать команду к ListView.ItemTapped.

person Rohit Vipin Mathews    schedule 03.08.2016
comment
Спасибо за ответ, для IOS щелчок работает, но после долгого нажатия - person Pooja Rawat; 04.08.2016
comment
Долгое нажатие на элемент списка? - person Rohit Vipin Mathews; 04.08.2016
comment
Да, у нас есть представление списка, приведенный выше код работает нормально, и мы можем выбрать элемент из ListView. Но в случае iOS нам нужно долго нажимать на элемент, чтобы событие сработало. - person Pooja Rawat; 04.08.2016
comment
Ваш OnItemTapped срабатывает при нажатии на элемент списка? - person Rohit Vipin Mathews; 04.08.2016
comment
Да, он срабатывает при нажатии в обоих случаях (Android и iOS), но в iOS, чтобы запустить его, нам нужно нажимать его в течение длительного времени (долгое нажатие). - person Pooja Rawat; 04.08.2016
comment
Событие работает одинаково как на iOS, так и на Android. Также обратите внимание, что в Xamarin.Forms нет поддержки длинных пресс-событий. - person Rohit Vipin Mathews; 04.08.2016
comment
@PoojaRawat У нас такая же проблема. Вы нашли способ решить эту проблему? - person Amenti; 16.06.2017
comment
Когда зарегистрировано несколько GestureRecognizer, iOS, похоже, отдает предпочтение последнему, а Android вызывает их все. В моем случае это привело к проблеме. - person Amenti; 23.06.2017
comment
Всегда лучше зарегистрировать только один обработчик событий и вызывать от него столько функций, сколько вы хотите. @Amenti - person Rohit Vipin Mathews; 24.06.2017