当 select 个项目时,xamarin Forms ListView Item Tapped 和 Item Selected 一起 运行

xamarinForms ListView ItemTapped and ItemSelected is running together when select an item

我有一个包含两个事件 "ItemTapped" 和 "ItemSelected" 的 ListView,当用户 select 该项目应该出现警报 "You selected item" 时,当用户点击应该出现一个警报 "You tapped item" 项目。 但是发生的事情是当用户 select 一个项目时,首先出现 "You tapped item" 的警报然后出现 "You selected item" 的警报为什么会这样???

这是我的 Xaml 文件

 <ListView x:Name="listView" 
              ItemTapped="Tapped"
              ItemSelected="Select">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextCell Text="{Binding Name}" Detail="{Binding Status}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

代码隐藏

 void Select(object sender, Xamarin.Forms.SelectedItemChangedEventArgs e)
    {
        var contact = e.SelectedItem as Contact;
        DisplayAlert("selected", "You selected item", "Ok");

        // listView.SelectedItem = null;
    }


    void Tapped(object sender, Xamarin.Forms.ItemTappedEventArgs e)
    {
        var contact = e.Item as Contact;
        DisplayAlert("tapped", "You tapped item", "Ok");
    }

当您 点击 一个项目时会触发 ItemTapped 事件。

当您selected 一个项目时,ItemSelected 事件被触发。当您点击当前未 select 的项目时,您 select 一个项目。

在这种情况下,如果您点击的项目不是 selected,ItemTappedItemSelected 事件都会被触发。

一种解决方法可以管理这两个事件,例如, 您可以在双击列表项时调用 Listview ItemTapped 事件。 & 默认Listview Single Tap可以获得ItemSelected Event.

注意:这只是同时管理两者的解决方法。

另一个简单的解决方法是计算触发 Tapped 事件的次数。正如我所意识到的,Tapped 事件总是在 Selected 事件之前触发,因此只需定义一个整数,在每个 Tapped 事件中增加它,并在 Selected 事件中重置。

private int _myListTapNumber = 0;

...
private void MyList_ItemTapped(object sender, ItemTappedEventArgs e)
{
    if (_myListTapNumber > 1)
    {
        DisplayAlert("Tapped", "Tap event fired.", "OK");
    }
    _myListTapNumber++;
}

private void MyList_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    _myListTapNumber = 1;

    DisplayAlert("Selected", "Selected event fired.", "OK");
}
private bool selectionFixed = false;
void Select(object sender, SelectedItemChangedEventArgs e)
{
    selectionFixed = false;
}

void Tapped(object sender, ItemTappedEventArgs e)
{
    if (selectionFixed)
        DisplayAlert("Choice", "Your Choice: " + e.Item, "Ok");
    else
        selectionFixed = true;
}