Xamarin Forms Получить элемент объекта при нажатии на изображение - PullRequest
0 голосов
/ 05 февраля 2020

У меня проблема. Я создал CollectionView из списка с именем: List<Set> Sets, и в наборе у меня есть список с именем List<Picture> Pictures.

Вот как выглядят классы:

public class Set
{
    public int Id { get; set; }
    public List<Picture> Pictures{ get; set; }
}

И Класс рисунков выглядит следующим образом:

public class Picture
{
    public int Id { get; set; }
    public string Name { 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>

Теперь я уже получил этот код:

private void AlbumFoto_Clicked(object sender, EventArgs e)
{
    CachedImage image = (CachedImage)sender;
    var setPicture = image.Source.BindingContext as Picture;
    var ImageId = setPicture.Id;

    var Pictureindex = 0;
    foreach (var set in Sets.Where(set => Pictures.Picture.Any(p => p.Id == ImageId)))
    {
        Pictureindex = set.Pictures.Picture.FindIndex(p => p.Id == ImageId);
    }
}

Теперь, как я могу получить Id из набора кликаемого изображения?

1 Ответ

0 голосов
/ 05 февраля 2020

Вместо использования события click, вы должны использовать Command и CommandParameter и использовать BindingContext родительской коллекции

<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>

И в вашей ViewModel:

public Command<int> ImageClickCommand{ get; set; }

И в вашем конструкторе ViewModel:

ImageClickCommand = new Command<int>((Id) =>
{
    //Id -> id of the image
});

Но если вы все еще хотите использовать событие Clicked, я бы посоветовал вам сделать это изменение.

Добавьте новое свойство в свой класс изображения:

public class Picture
{
    public int Id { get; set; }
    public int SetId { get; set; }
    public string Name { get; set; }
}

Предполагая, что вы получаете эту Коллекцию от Сервиса, вы можете перебрать ее и установить свой SetId следующим образом:

foreach (var item in Collection)
{
    foreach (var picture in item.Pictures)
    {
         picture.SetId = item.Id   
    }         
}

Теперь в вашем Clicked вы должны иметь доступ к обоим Идентификатор изображения и соответствующий идентификатор набора:

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