我无法访问 XAML 和代码隐藏中 ListView 中的 x:Name 控件

I am not able to access x:Name of controls in ListView in XAML and Code behind

我有一个 Xamarin 表单中的 ListView,其中有一个自定义单元格。自定义单元格包含一个带有 x:Name 属性的图像控件。现在我尝试将 activity 指示器 IsRunning 属性 绑定到图像 IsLoading 属性 并且 Xamarin 表单无法使用 x:Name 找到图像。我也试过从后端访问,同样的事情。

我在 Listview 中添加了其他元素,它们的 x:Name 也不可见。

注意:我可以访问 x:Name 我放在 ListView 之外的控件,所以它看起来像一个列表视图问题。

<StackLayout>
    <ActivityIndicator x:Name="activity" Color="Purple" HeightRequest="50" WidthRequest="50" IsRunning="{Binding Source={x:Reference Offerimg},Path=IsLoading}"></ActivityIndicator>


    <ListView x:Name="OfferLV" HasUnevenRows="True" x:FieldModifier="Public" SeparatorVisibility="None" BackgroundColor="White">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell >
                    <StackLayout Padding="0,10,0,10">
                        <Image  x:Name="offerimg" HeightRequest="500" WidthRequest="100" Aspect="AspectFill"></Image>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

这就是 XAML 技术(包括 Xamarin.Forms)的预期工作方式。

不仅有一个 ViewCell,而且可能有数千个,您无法使用同一个名称访问数千个不同的项目。

推荐的方式是使用数据绑定。通常,您还可以通过在事件中强制转换 sender 来访问这些项目。

有一个非常好的库 FFImageLoading 可以帮助您做您想做的事,并且有一个内置的 IsLoading 属性 可以相应地显示 ActivityIndicator。您还可以处理加载错误等......

<ListView VerticalOptions="StartAndExpand" ItemsSource="{Binding Items}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid>
                            <ff:CachedImage x:Name="Image" Source="https://www.allibert-trekking.com/uploads/media/images/thumbnails/AMin3_10-photo-montagne-chine-lac.jpeg?v2" />
                            <ActivityIndicator Color="OrangeRed" IsRunning="{Binding IsLoading}" IsVisible="{Binding IsLoading}" BindingContext="{x:Reference Name=Image}" />
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

我在这里为这个例子创建了一个示例:https://github.com/vincentcastagna/ImageLoadingPlaceHolder