DataTemplate 中的 CollectionView 始终保持为空

CollectionView within a DataTemplate always remains empty

我有一个 CarouselView,其中 DataTemplate 我有一个 CollectionView,其 ItemsSource 属性 绑定到 Observablecollection,其中仅当用户按下按钮时才添加元素。问题是这个CollectionView总是空的,我看不到任何项目

<CarouselView
                    x:Name="CollectionDiary"
                    RelativeLayout.YConstraint="{ConstraintExpression
                    Type=Constant,
                    Constant=242}"
                    RelativeLayout.WidthConstraint="{ConstraintExpression
                    Type=RelativeToParent,
                    Property=Width,
                    Factor=1}"
                    PeekAreaInsets="20"
                    HeightRequest="330">
                    <CarouselView.ItemsLayout>
                        <LinearItemsLayout Orientation="Horizontal" SnapPointsType="MandatorySingle" SnapPointsAlignment="Center" ItemSpacing="5"/>
                    </CarouselView.ItemsLayout>
                    <CarouselView.ItemTemplate>
                        <DataTemplate>
                            <yummy:PancakeView  CornerRadius="22" BackgroundColor="Transparent">
                                <yummy:PancakeView.Shadow>
                                    <yummy:DropShadow Color="#000000" Offset="2,2" BlurRadius="5" Opacity="0.8" />
                                </yummy:PancakeView.Shadow>
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="25"/>
                                        <RowDefinition Height="15"/>
                                        <RowDefinition Height="45"/>
                                        <RowDefinition Height="268"/>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="70"/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.Background>
                                        <LinearGradientBrush StartPoint="1,0" EndPoint="1,1">
                                                <GradientStop Color="Black" Offset="0" />
                                                <GradientStop Color="#4191cc" Offset="1.0" />
                                        </LinearGradientBrush>
                                    </Grid.Background>
                                    <Label Grid.Row="0" Grid.Column="1" Text="{Binding Data}" FontSize="14" TextColor="Gray" VerticalTextAlignment="End" Margin="10,5,10,0"/>
                                    <Label Grid.Row="1" Grid.Column="1" Text="{Binding Orario}" FontSize="14" TextColor="Gray" VerticalTextAlignment="End" Margin="10,0"/>
                                    <Image Grid.Row="0" Grid.RowSpan="3" Grid.Column="0" Margin="15,15,0,0" Source="{Binding Umore}" HeightRequest="60"/>
                                    <Label Grid.Row="2" Grid.Column="1" Text="{Binding TipoUmore}" FontAttributes="Bold" TextColor="{Binding ColoreUmore}" FontSize="22" Margin="10,0" VerticalOptions="Start"/>
                                    <Label Grid.Row="3" Grid.Column="1" TextColor="White" FontSize="16" Text="{Binding Nota}" Margin="10,0" VerticalOptions="Start" HorizontalTextAlignment="Start"/>
                                    <CollectionView
                                        Grid.Row="2"
                                        Grid.Column="0"
                                        Margin="10"             
                                        SelectionMode="None"
                                        ItemsSource="{Binding listEmojiDiarioView}">
                                        <CollectionView.ItemsLayout>
                                            <GridItemsLayout Orientation="Vertical" VerticalItemSpacing="10" HorizontalItemSpacing="10"/>
                                        </CollectionView.ItemsLayout>
                                        <CollectionView.ItemTemplate>
                                            <DataTemplate>
                                                <Grid>
                                                    <Grid.RowDefinitions>
                                                        <RowDefinition Height="*"/>
                                                    </Grid.RowDefinitions>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="*"/>
                                                        <ColumnDefinition Width="Auto"/>
                                                    </Grid.ColumnDefinitions>
                                                    <Image Grid.Row="0" Grid.Column="0" Source="{Binding SourceImg}"/>
                                                    <Label Grid.Row="0" Grid.Column="1" Text="{Binding id}" TextColor="White" FontSize="13"/>
                                                </Grid>
                                            </DataTemplate>
                                        </CollectionView.ItemTemplate>
                                    </CollectionView>
                                </Grid>
                            </yummy:PancakeView>
                        </DataTemplate>
                    </CarouselView.ItemTemplate>
                </CarouselView>

c#

ObservableCollection<HumorDiary> listDiario = new ObservableCollection<HumorDiary>();
ObservableCollection<IconDiary> listEmojiDiarioView = new ObservableCollection<IconDiary>();

        private async void BTSaveDiary_Clicked(object sender, EventArgs e)
                {
    
                     HumorDiary hum = new HumorDiary
                    {
                        Nota = TestoDiary.Text,
                        Data = DateTime.Today.Day.ToString() + " " + Mese,
                        Orario = DateTime.Now.TimeOfDay.ToString().Remove(5,DateTime.Now.TimeOfDay.ToString().Length-5),
                        Anno = DateTime.Now.Year.ToString(),
                        Umore = "Smile" + NUmore + ".png",
                        TipoUmore = tipoUmore,
                        ColoreUmore = Colore,
                        IconTot = NIcon,
                    };
    
                    string[] srListIcon = NIcon.Split(new string[] { set.Tag }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (string sr in srListIcon)
                    {
                        string src = sr.Substring(0, 9);
                        string id = sr.Substring(9, sr.Length-9);
                        IconDiary ic = new IconDiary
                        {
                            SourceImg = src,
                            id = id,
                        };
                        listEmojiDiarioView.Add(ic);
                    }
    
                    listDiario.Insert(0, hum);
                    CollectionDiary.ItemsSource = listDiario.Take(3);
             }
  1. 由于 CarouselView 中的 BindingContext 更改并将其 ItemsSource 作为 BindingContext,您需要明确指定您的 BindingContext 以防你的CollectionView。我想如果您查看日志,您会发现一些绑定 error/failure,因为它正在寻找一个 IEnumerable 属性,其中 listEmojiDiarioViewlistDiario 中显然不存在

克服此问题的一种方法是使用页面引用作为绑定源:

<ContentPage x:Name="pageref" ...

     <CollectionView ...
          ItemsSource="{Binding Source={x:Reference pageref}, Path=BindingContext.listEmojiDiarioView}">
  1. listEmojiDiarioView 必须是

  2. 如果它不起作用,请检查您是否在用于绑定的 ObservableCollection 上实施了 INotifyPropertyChanged。 省略的代码保持不变。

相关文档

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-binding-basics