Xamarin - 清除列表视图选择

本文关键字:视图 选择 列表 清除 Xamarin | 更新日期: 2023-09-27 18:33:14

我实际上正在使用这段代码

using System;
using Xamarin.Forms;
using System.Diagnostics;
namespace CryptoUI
{
    public class HomePage : Xamarin.Forms.MasterDetailPage
    {
        public HomePage()
        {
        // Set up the Master, i.e. the Menu
            Label header = new Label
            {
                Text = "MENU",
                Font = Font.SystemFontOfSize(20, FontAttributes.Bold),
                HorizontalOptions = LayoutOptions.Center
            };
        // create an array of the Page names
        string[] myPageNames = {
            "Main",
            "Page 2",
            "Page 3",
        };
        // Create ListView for the Master page.
        ListView listView = new ListView
        {
            ItemsSource = myPageNames,
        };
        // The Master page is actually the Menu page for us
        this.Master = new ContentPage
        {
            Title = "Test",
            Content = new StackLayout
            {
                Children = 
                {
                    header, 
                    listView
                },
            }
        };
        // Define a selected handler for the ListView contained in the Master (ie Menu) Page.
        listView.ItemSelected += (sender, args) =>
        {
            // Set the BindingContext of the detail page.
            this.Detail.BindingContext = args.SelectedItem;
            string currentPage = this.GetType().Name.ToString();
            // This is where you would put your “go to one of the selected pages”
            if(listView.SelectedItem.Equals("Main") && !currentPage.Equals("HomePage")){
                AsyncPush(new HomePage());
            }
            else if(listView.SelectedItem.Equals("Page 2") && !currentPage.Equals("SecondPage")){
                AsyncPush(new SecondPage());
            }
            else if(listView.SelectedItem.Equals("Page 3") && !currentPage.Equals("ThirdPage")){
                AsyncPush(new ThirdPage());
            }               
            // Show the detail page.
            this.IsPresented = false;
        };
            listView.ItemSelected += (senders, e) => {
                if (e.SelectedItem == null) return; // don't do anything if we just de-selected the row
                // do something with e.SelectedItem
                ((ListView)senders).SelectedItem = null; // de-select the row
            };
        // Set up the Detail, i.e the Home or Main page.
        Label myHomeHeader = new Label
        {
            Text = "Home Page",
            HorizontalOptions = LayoutOptions.Center
        };
        string[] homePageItems = { "Alpha", "Beta", "Gamma" };
        ListView myHomeView = new ListView {
            ItemsSource = homePageItems,
        };
        var myHomePage = new ContentPage();
        myHomePage.Content = new StackLayout
        {
            Children = 
            {
                myHomeHeader, 
                myHomeView
            } ,
        };
        this.Detail = myHomePage;
    }
        public async void AsyncPush(Page page)
        {
            await Navigation.PushAsync(page);
        }
    }
}

此代码实际上显示了使用 Xamarin 窗体技术的简单浮出控件菜单。我目前正在尝试了解如何在选择要前往的页面后轻松清除 ListView 选择!

我在 Xamarin 的开发人员网站上找到了这段代码 (http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/listview/);

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

但是我目前无法弄清楚如何将其与上面的代码集成:)

Xamarin - 清除列表视图选择

我想

补充一下Jason的答案,因为它遗漏了一些重要信息。 将 ListView SelectedItem 属性设置为 null 时,它将再次触发 ItemSelected 事件。 因此,如果您没有空检查,它将引发异常。

这是它应该的样子:

void ItemSelected(object sender, EventArgs args)
{
    if (((ListView)sender).SelectedItem == null)
      return;
    //Do stuff here with the SelectedItem ...
    ((ListView)sender).SelectedItem = null;
}

你分配了两次 ItemSelected 处理程序,这是一个坏主意。 您需要做的就是将此行添加到现有的 ItemSelected 处理程序中

  ((ListView)sender).SelectedItem = null; 

我遇到了同样的问题,但其他解决方案对我不起作用。由于我需要将自定义对象传递到下一页,因此我取消了所选项目引用,并将项目点击引用用于我的自定义对象。

listView.ItemTapped += async (sender, e) =>{
    await Navigation.PushAsync(new DetailPage(e.Item as CustomObject));
    ((ListView)sender).SelectedItem = null;
};

ListView.SelectedItem 没有 setter(我的意思是简单的 Xamarin Android - 而不是 Xamarin.Forms)。我建议使用以下代码:

private void DeselectEntities()
{
    if (this.listView != null && this.listView.CheckedItemPositions != null)
    {
        this.listView.CheckedItemPositions.Clear();
    }
}

我尊重所有给定的答案,但在 MVVM 应用程序中,您最好避免过多的代码。我通常做的是:

  1. 像往常一样将项目列表视图的来源绑定到可观察集合,其中 T 在我的情况下是 CarViewModel

  2. 设置选择模式="无":这确实避免了在点击时选择选定项

  3. 使用
  4. EventToCommandBehavior(我使用自己的实现;请参阅 github.com 或使用 Prism.Forms 中的那个)将 ListView 的 ItemTapped 事件绑定到我的 ViewModel 命令 SelectedCarChangedCommand。

  5. 在视图模型的 SelectedCarChangedCommand 中,您将收到选项卡式项作为 ItemTappedEventArgs 对象。

     <ListView
       x:Name="CarsListView"
       ItemsSource="{Binding Cars}"
       SelectionMode="None">
         <ListView.Behaviors>
             <behaviors:EventToCommandBehavior
                 Command="{Binding SelectedCarChangedCommand}"
                 EventName="ItemTapped" />
         </ListView.Behaviors>