我无法访问 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
我有一个 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