C# Xamarin表单在单击图像时获取对象元素
我有个问题。我从一个名为:C# Xamarin表单在单击图像时获取对象元素,c#,xamarin,xamarin.forms,xamarin.android,xamarin.ios,C#,Xamarin,Xamarin.forms,Xamarin.android,Xamarin.ios,我有个问题。我从一个名为:列表集的列表中创建了一个CollectionView,在一个集合中,我有一个名为列表图片的列表 下面是这些类的外观: public class Set { public int Id { get; set; } public List<Picture> Pictures{ get; set; } } 现在在我的XAML中,我在每个图像上添加了一个单击事件,因为我需要知道哪个图像被单击了。问题是,我还需要知道图像单击是在哪个集合中完成的,因为
列表集
的列表中创建了一个CollectionView,在一个集合中,我有一个名为列表图片
的列表
下面是这些类的外观:
public class Set
{
public int Id { get; set; }
public List<Picture> Pictures{ get; set; }
}
现在在我的XAML中,我在每个图像上添加了一个单击事件,因为我需要知道哪个图像被单击了。问题是,我还需要知道图像单击是在哪个集合中完成的,因为一个图像可以是多个集合
以下是XAML:
<CollectionView ItemsSource="{Binding Sets}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<ScrollView Orientation="Horizontal">
<StackLayout BindableLayout.ItemsSource="{Binding Pictures}" Orientation="Horizontal">
<BindableLayout.ItemTemplate>
<DataTemplate>
<ff:CachedImage Aspect="AspectFill" Source="{Binding imageSource}">
<ff:CachedImage.GestureRecognizers>
<TapGestureRecognizer Tapped="AlbumFoto_Clicked" />
</ff:CachedImage.GestureRecognizers>
</ff:CachedImage>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</ScrollView>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
现在,如何从单击的图像集中获取Id?您应该使用
命令
和命令参数
并使用父集合的绑定上下文,而不是使用单击事件
<CollectionView ItemsSource="{Binding Sets}">
<CollectionView.ItemsLayout>
<GridItemsLayout Orientation="Vertical" />
</CollectionView.ItemsLayout>
<CollectionView.ItemTemplate>
<DataTemplate>
<ScrollView x:Name="ParentCollection" Orientation="Horizontal">
<StackLayout BindableLayout.ItemsSource="{Binding Pictures}" Orientation="Horizontal">
<BindableLayout.ItemTemplate>
<DataTemplate>
<ff:CachedImage Aspect="AspectFill" Source="{Binding imageSource}">
<ff:CachedImage.GestureRecognizers>
<TapGestureRecognizer Command="{Binding ImageClickCommand}" CommandParameter="{Binding BindingContext.Id, Source={x:Reference Name=ParentCollection}}"/>
</ff:CachedImage.GestureRecognizers>
</ff:CachedImage>
</DataTemplate>
</BindableLayout.ItemTemplate>
</StackLayout>
</ScrollView>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
假设您从服务接收到该集合,可以对其进行迭代,并按如下方式设置SetId:
public class Picture
{
public int Id { get; set; }
public string Name { get; set; }
}
foreach (var item in Collection)
{
foreach (var picture in item.Pictures)
{
picture.SetId = item.Id
}
}
现在,在单击的屏幕中,您应该可以访问图片Id和相应的集合Id:
private void AlbumFoto_Clicked(object sender, EventArgs e)
{
CachedImage image = (CachedImage)sender;
var setPicture = image.Source.BindingContext as Picture;
var ImageId = setPicture.Id;
var SetId = setPicture.SetId;
//...
}
您正在使用MVVM吗?是的,我正在使用ViewModel我需要设置Id,而不是图像Id。。。。在我的问题中,已经是获取ImageId的代码了!那我还有一个问题要问你。。。如果我按你的方式使用,我如何获得图片Id和设置Id?因此,在ViewModel中,单击图片后,我需要图片Id和图片所在集合中的Id!陛下也许可以在图片类中添加一个属性,比如int SetId,这样,你就可以使用你已经拥有的事件,在发送者中,你可以访问图片id和set idI。我不太明白,你能给我一个示例代码或其他什么吗。我理解第一部分,但现在和发送者在一起@A.Vreeswijk我不知道您是如何获取数据的,但我将向我的anwser中添加一些内容(我将确保您从API服务接收您的收集)
ImageClickCommand = new Command<int>((Id) =>
{
//Id -> id of the image
});
public class Picture
{
public int Id { get; set; }
public int SetId { get; set; }
public string Name { get; set; }
}
foreach (var item in Collection)
{
foreach (var picture in item.Pictures)
{
picture.SetId = item.Id
}
}
private void AlbumFoto_Clicked(object sender, EventArgs e)
{
CachedImage image = (CachedImage)sender;
var setPicture = image.Source.BindingContext as Picture;
var ImageId = setPicture.Id;
var SetId = setPicture.SetId;
//...
}