微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

即使设置了绑定并将数据添加到可观察集合,Xamarin Forms Collectionview 也不会在 UI 上显示任何内容

如何解决即使设置了绑定并将数据添加到可观察集合,Xamarin Forms Collectionview 也不会在 UI 上显示任何内容

我是一个初学者,所以放轻松。我有一个绑定到可观察集合的集合视图。可观察集合接收数据并拥有项目,但 Collectionview 根本不显示任何内容。有人可以帮我解决这个问题。谢谢。

XAML

        <CollectionView Grid.Row="1" ItemsSource="{Binding Fav}" x:Name="CVWatchItems" SelectionMode="Single" SelectionChanged="CVWatchItems_SelectionChangedAsync">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <StackLayout Padding="8,8,0">
                        <Frame BorderColor="LightGray" CornerRadius="0" HasShadow="True" Padding="5">
                            <Grid Padding="0" ColumnSpacing="0" RowSpacing="0" Margin="2">
                                <Grid.RowDeFinitions>
                                    <RowDeFinition Height="*" />
                                </Grid.RowDeFinitions>
                                <Grid.ColumnDeFinitions>
                                    <ColumnDeFinition Width="120"/>
                                    <ColumnDeFinition Width="*"/>
                                </Grid.ColumnDeFinitions>

                                <ffimageloading:CachedImage Source="{Binding SingleimageUrl}" Aspect="AspectFill" WidthRequest="120" HeightRequest="100" Grid.Row="0" Grid.Column="0"/>

                                <Grid Grid.Row="0" Grid.Column="1" Padding="5">
                                    <Grid.RowDeFinitions>
                                        <RowDeFinition Height="Auto"/>
                                        <RowDeFinition Height="Auto"/>
                                        <RowDeFinition Height="*"/>
                                    </Grid.RowDeFinitions>
                                    <Label Padding="0,3" Text="{Binding Title}" LineBreakMode="TailTruncation" TextColor="Black" FontSize="Medium" Grid.Row="0"/>
                                    <Label Text="{Binding Price,StringFormat='Nu.{0}'}" FontSize="Small" TextColor="Black"  Grid.Row="1"  HorizontalOptions="StartAndExpand" />
                                    <Grid Grid.Row="2">
                                        <Grid.ColumnDeFinitions>
                                            <ColumnDeFinition Width="7*"/>
                                            <ColumnDeFinition Width="Auto"/>
                                        </Grid.ColumnDeFinitions>

                                        <Label Text="{Binding location}" FontSize="Small" TextColor="Gray" Grid.Column="0" HorizontalOptions="StartAndExpand" VerticalOptions="EndAndExpand"/>
                                        <!--Watchlist Icon-->
                                        <Image Source="{Binding Favorite}" Grid.Column="1" Aspect="AspectFill" HeightRequest="28" Margin="2,0" HorizontalOptions="EndAndExpand" VerticalOptions="EndAndExpand">
                                            <Image.GestureRecognizers>
                                                <TapGestureRecognizer Tapped="TapGestureRecognizer_Tapped"/>
                                                <!--Give ID to each ad and stored data is retrieved through id.-->
                                            </Image.GestureRecognizers>
                                        </Image>
                                    </Grid>
                                </Grid>

                            </Grid>
                        </Frame>
                    </StackLayout>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

背后的代码

   public static ObservableCollection<Item> Fav { get; set; } = new ObservableCollection<Item>();
   public Watchlist ()
    {
        InitializeComponent ();
        NavigationPage.SetHasNavigationBar(this,false);
        NavigationPage.SetHasBackButton(this,false);

        CVWatchItems.SetBinding(CollectionView.ItemsSourceProperty,nameof(Fav));

        GetFavItems();
    }  

    private async void GetFavItems()
    {
        var MyFavorites = await Task.WhenAll(FirebaseDataHelper.GetFavoriteItems(allFavorites));
        
                foreach (var favorite in MyFavorites)
                {
                    if (favorite.Count > 0)
                    {
                        for (int i = 0; i < favorite.Count; i++)
                        {
                            favorite[i].IsFavorite = true;
                            if (!Fav.Any(s => s.Id == favorite[i].Id))
                                Fav.Add(favorite[i]);
                                
                        }
                    }
                }

               
      }

谢谢各位。

解决方法

首先,您的 observable 集合是静态的,您从未将 BindingContext 设置到您的页面。

public static ObservableCollection<Item> Fav { get; set; } = new ObservableCollection<Item>();

从 Fav 的定义中删除 static 关键字,更改 XAML 中的绑定(`为页面分配名称),例如:

<ContentPage x:Name="Root" ..../>

<CollectionView Grid.Row="1" ItemsSource="{Binding Source={x:Reference Name=Root},Path=Fav}" ..../>

还要从后面的代码中删除绑定。最后一件事,你的页面必须实现 INotifyPropertyChanged 接口,因为你必须告诉页面这个集合发生了变化(你的集合在你的异步任务完成后被填充)所以你必须在你的集合被填充后引发 PropertyChanged

但也许在您的情况下,在没有绑定的情况下设置 ItemsSource 更好更容易,因为您没有使用 MVVM。 如果您在页面后面的代码中,则没有必要使用绑定。您可以将 collectionview itemsource 设置为:

 private async void GetFavItems()
    {
        var MyFavorites = await Task.WhenAll(FirebaseDataHelper.GetFavoriteItems(allFavorites));
        
                foreach (var favorite in MyFavorites)
                {
                    if (favorite.Count > 0)
                    {
                        for (int i = 0; i < favorite.Count; i++)
                        {
                            favorite[i].IsFavorite = true;
                            if (!Fav.Any(s => s.Id == favorite[i].Id))
                                Fav.Add(favorite[i]);
                                
                        }
                    }
                }

               CVWatchItems.ItemsSource = Fav;
      }

如果您将在应用程序中使用 MVVM,则应使用绑定。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。