首页 > 解决方案 > 版本 5 中的 Xamarin.Forms CollectionView 和 IsVisible 奇怪行为

问题描述

我注意到最新版本的 Xamarin.Forms (5.0.02244) 和为 iOS 15 构建的东西有些奇怪。以下内容不影响此应用程序的 Android 版本,使用针对 Android 的最新 XF 构建可以正常使用此代码。XF < v5 或 iOS 14 不存在此问题。

Xamarin.Forms v4.x 和 v5 之间的 IsVisible 逻辑是否发生了变化?同样,降级到 XF 4 时,同样的代码也能正常工作。但是对于最新的 XCode 版本和 iOS 15,我现在需要使用 XF v5。

还是我做错了,它恰好适用于 XF v4(并且仍然适用于带有 XF v5 的 Android)

最小的例子:

下面是搜索框和结果视图的 XAML。结果视图填充了包含在搜索框中键入的文本的项目 (ItemsList)。它的高度也由 searchZoneHeight 设置。这一切都适用于 Android 和 iOS XF < v5。

isSearchResultVisible当用户点击一个项目时设置,点击该项目将搜索栏文本设置为该项目,然后隐藏搜索结果。我在带有 XF v5 的 iOS 中看到的是 CollectionView 仍然显示为一个白框。白框的大小是一个搜索结果的高度。因此,视图的高度设置正确,但请求 isSearchResultVisible = false;没有得到尊重。控制台中没有错误输出。

如果我绑定请求以使某些东西在点击时对另一个 UI 组件不可见,它就可以工作。似乎只有 RefreshView/CollectionView 忽略它。

任何建议都非常感谢,谢谢,

XAML

  <SearchBar Text="{Binding searchText}" Placeholder="Type to search" IsSpellCheckEnabled="False" />

            <RefreshView x:DataType="local:ViewModel" IsVisible="{Binding isSearchResultVisible, Mode=TwoWay}" Command="{Binding searchItems}"  >
                <CollectionView HeightRequest="{Binding searchZoneHeight}"  x:Name="ItemsList"
            ItemsSource="{Binding searchResultItems}"
            SelectionMode="None" >
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <StackLayout  Padding="10" x:DataType="model:Item" >
                                <Label Text="{Binding Text}" 
                        Style="{DynamicResource ListItemTextStyle}" 
                        FontSize="16" />
                              
                                <StackLayout.GestureRecognizers>
                                    <TapGestureRecognizer 
                            NumberOfTapsRequired="1"
                            Command="{Binding Source={RelativeSource AncestorType={x:Type local:ViewModel}}, Path=ItemTapped}"      
                            CommandParameter="{Binding .}">
                                    </TapGestureRecognizer>
                                </StackLayout.GestureRecognizers>
                            </StackLayout>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>

                </CollectionView>
            </RefreshView>

查看模型

 async void OnItemSelected(Item item)
            {
                // This fires so I know the tap event works
                Debug.WriteLine("Search result was tapped " + item.Text);
                // Below line does set the search text correctly (iOS and Android)
                searchText = item.Text;
                // Below doesn't work on iOS
                isSearchResultVisible = false;
                OnPropertyChanged(nameof(isSearchResultVisible));
                // Below line also does not work on iOS
                //OnPropertyChanged("isSearchResultVisible");
            }

标签: c#iosxamarin.formsxamarin.androidxamarin.ios

解决方案


推荐阅读