如何在xamarin中清除collectionview选择

polkgigr  于 2023-10-14  发布在  其他
关注(0)|答案(3)|浏览(121)

在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的方法是在单击时运行两次。为什么?这是我所有的代码

iqjalb3h

iqjalb3h1#

@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;
    }
bvjxkvbb

bvjxkvbb2#

这里有一个简单的解决方案,为我工作。设置为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;
    }
ckocjqey

ckocjqey3#

这是一个老问题,但由于没有公认的答案,因此有一个更新:
((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的代码,但也检查nullnull,这是一个很好的和安全的事情。
然而,它也会导致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。

相关问题