【问题标题】:xamarinForms ListView ItemTapped and ItemSelected is running together when select an item选择一个项目时,xamarin Forms ListView ItemTapped 和 Item Selected 一起运行
【发布时间】:2018-04-01 07:38:55
【问题描述】:

当用户选择项目时,我有一个带有两个事件“ItemTapped”和“ItemSelected”的 ListView,应该出现警报“您选择的项目”,当用户点击项目时,应该出现警报“您已点击项目”出现。 但是发生的情况是当用户选择一个项目时,首先出现“您已点击项目”的警报,然后出现“您选择的项目”的警报,为什么会发生这种情况???

这是我的 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");
    }

【问题讨论】:

    标签: listview xamarin.forms xamarin.forms.listview


    【解决方案1】:

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

    当您选择一个项目时,ItemSelected 事件会被触发。当您点击当前未选择的项目时,您选择了一个项目。

    在这种情况下,如果您点击未选中的项目,ItemTappedItemSelected 事件都将被触发。

    【讨论】:

    • 这是从哪个版本开始的?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      另一个简单的解决方法是计算已触发 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");
      }
      

      【讨论】:

        【解决方案4】:
        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;
        }
        

        【讨论】:

        • 欢迎来到 Stack Overflow。请注意,解释答案总是比只发布代码片段更好
        猜你喜欢
        • 1970-01-01
        • 2016-08-04
        • 2012-04-25
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 2017-01-09
        • 1970-01-01
        • 2012-04-17
        相关资源
        最近更新 更多