在第 1 页上,我有一个带有文本/字符串项目列表的集合视图。如果您点击某个项目,它将获取当前点击的文本/字符串并发送到第 2 页。听起来很简单
我遇到的问题:如果你点击item#1,那么它会将item#1发送到page2,这部分工作正常。但是在第 2 页上,如果您点击后退按钮,然后再次点击第 1 项.. 没有任何反应,它不会转到第 2 页
修复:我认为我需要以某种方式清除点击选择,然后将项目发送到第2页。但我不知道该怎么做
在第 1 页上,我有一个简单的集合视图。集合视图包含文本/字符串列表
<CollectionView ItemsSource="{Binding MyListItem}"
SelectionMode="Single"
SelectionChanged="CollectionView_SelectionChanged">
<CollectionView.ItemTemplate>
<DataTemplate>
<ContentView>
<!-- Body -->
<Grid Padding="0">
<Frame CornerRadius="3" BorderColor="#f2f4f5" HasShadow="True">
<StackLayout Orientation="Horizontal">
<Image Source="icon_about"
WidthRequest="25" />
<StackLayout VerticalOptions="Center">
<Label VerticalOptions="Center"
FontSize="16"
Text="{Binding .}" />
</StackLayout>
</StackLayout>
</Frame>
处理选择的后端代码是:
private async void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var previous = e.PreviousSelection.FirstOrDefault();
var current = e.CurrentSelection.FirstOrDefault();
var route = $"{ nameof(Page2) }?URLCardType={current}";
await Shell.Current.GoToAsync(route);
//clear selection
((CollectionView)sender).SelectedItem = null;
}
更新
((CollectionView)sender).SelectedItem = null;
修复了清除所选项目的问题,但CollectionView_SelectionChanged
方法在单击时运行两次。为什么?这是我所有的代码
@jason 谢谢,这对我有用。我只需要检查选择项是否为空而不是不执行任何操作
private async void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var MyCollectionView = sender as CollectionView;
if (MyCollectionView.SelectedItem == null)
return;
var previous = e.PreviousSelection.FirstOrDefault();
var current = e.CurrentSelection.FirstOrDefault();
var route = $"{ nameof(Page2) }?URLCardType={current}";
await Shell.Current.GoToAsync(route);
//clear selection
MyCollectionView.SelectedItem = null;
}
这是一个对我有用的简单解决方案。 设置为 null 并没有解决问题,它会导致各种问题 奇怪的东西。
private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var itemselected = e.CurrentSelection[0] as ProductsItem;
if (itemselected != null)
Shell.Current.GoToAsync(nameof(SelectedProductPage));
//Setting the selected item to an emptyviewproperty after navigation
CollectionList.SelectedItem = SelectableItemsView.EmptyViewProperty;
}
这是一个老问题,但由于没有公认的答案,所以有一个更新:
((CollectionView)sender).SelectedItem = null;修复了以下问题 清除所选项目,但 CollectionView_SelectionChanged 方法是 单击即可运行两次。为什么?这是我所有的代码
寻找一个我决定解释为什么以下代码具有某种副作用的原因,从历史上看,这种副作用可以追溯到 Visual Basic 6:
private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.CurrentSelection != null)
{
var current = e.CurrentSelection.FirstOrDefault();
// do something useful with current
//clear selection
((CollectionView)sender).SelectedItem = null;
}
}
上面的代码类似于 OP 的代码,但也检查
e.CurrentSelection
中的 null
,这是一件很好且安全的事情。
尽管如此,它也会导致
SelectionChanged
事件再次触发(因为 SelectedItem
以编程方式更改),并且相同的事件处理程序被调用 两次。虽然谦虚的程序员认为他/她是安全的,因为 e.CurrentSelection
被检查了 null
,但丑陋的事实是,他/她并不安全,因为由于某种原因,只有古代诸神才知道,e.CurrentSelection
是第二次不为空,代码会因NullPointerException
而中断。
因此,如果需要将所选项目设置为
null
,则必须仔细检查null
,例如:
private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.CurrentSelection != null)
{
var current = e.CurrentSelection.FirstOrDefault();
// double check for null because the event handler will be called twice
// (the second time when SelectedItem is set to null BELOW) in which
// case e.CurrentSelection is NOT null
if (current != null)
{
// do something useful with current
((CollectionView)sender).SelectedItem = null;
}
}
}
希望这能回答最初的问题和更新的问题,并帮助人们以(某种程度上)安全的方式清除 CollectionView 的 SelectedItem。