Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin表单在单击图像时获取对象元素_C#_Xamarin_Xamarin.forms_Xamarin.android_Xamarin.ios - Fatal编程技术网

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;
    //...
}