在Page#1上,我有一个带有文本/字符串项目列表的collectionview。如果你点击一个项目,它将获得当前点击的文本/字符串并发送到第2页。听起来简单
**问题我有:**如果你点击item#1,那么它会发送item#1到第2页,这部分工作正常.但在第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
的方法是在单击时运行两次。为什么?这是我所有的代码
3条答案
按热度按时间iqjalb3h1#
@Jason谢谢你,这对我很有用。我只是不得不检查选择项是否为空,而不是什么都不做
bvjxkvbb2#
这里有一个简单的解决方案,为我工作。设置为null并没有起到作用,它会导致各种奇怪的事情。
ckocjqey3#
这是一个老问题,但由于没有公认的答案,因此有一个更新:
((CollectionView)sender).SelectedItem = null;修复了清除选定项目的问题,但CollectionView_SelectionChanged方法在单击时运行两次。为什么?这是我所有的代码
我决定解释为什么下面的代码有一定的副作用,从历史上讲,可以追溯到Visual Basic 6:
上面的代码类似于OP的代码,但也检查
null
的null
,这是一个很好的和安全的事情。然而,它也会导致
SelectionChanged
事件再次触发(因为SelectedItem
是以编程方式更改的),并导致同一事件处理程序被调用 * 两次 *。虽然谦虚的程序员认为他/她是在安全的一边,因为e.CurrentSelection
是检查null
的丑陋的事实是,他/她不是,因为出于某种原因,只有古代神,e.CurrentSelection
是不空的第二次和代码中断与NullPointerException
。因此,如果需要将选定项设置为
null
,则必须仔细检查null
,例如:希望这既回答了原来的问题,也回答了更新后的问题,并帮助人们以一种(有点)安全的方式清除CollectionView的SelectedItem。