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
};
但是我目前无法弄清楚如何将其与上面的代码集成:)
补充一下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 应用程序中,您最好避免过多的代码。我通常做的是:
-
像往常一样将项目列表视图的来源绑定到可观察集合,其中 T 在我的情况下是 CarViewModel
-
设置选择模式="无":这确实避免了在点击时选择选定项
使用 EventToCommandBehavior(我使用自己的实现;请参阅 github.com 或使用 Prism.Forms 中的那个)将 ListView 的 ItemTapped 事件绑定到我的 ViewModel 命令 SelectedCarChangedCommand。
在视图模型的 SelectedCarChangedCommand 中,您将收到选项卡式项作为 ItemTappedEventArgs 对象。
<ListView x:Name="CarsListView" ItemsSource="{Binding Cars}" SelectionMode="None"> <ListView.Behaviors> <behaviors:EventToCommandBehavior Command="{Binding SelectedCarChangedCommand}" EventName="ItemTapped" /> </ListView.Behaviors>