如何清除xamarin中的collectionview选择

问题描述 投票:0回答:3

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

c# xamarin xamarin.forms collectionview
3个回答
2
投票

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

0
投票

这是一个对我有用的简单解决方案。 设置为 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;
    }

0
投票

这是一个老问题,但由于没有公认的答案,所以有一个更新:

((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。

© www.soinside.com 2019 - 2024. All rights reserved.