Я не могу получить доступ к x: Имя элементов управления в ListView в XAML и коде позади

У меня есть ListView в формах Xamarin, в которых есть настраиваемая ячейка. Настраиваемая ячейка содержит элемент управления Image с атрибутом x: Name. Теперь я попытался привязать свойство индикатора активности IsRunning к свойству IsLoading изображения, и формы Xamarin не смогли найти изображение с использованием x: Name. Я тоже пробовал получить доступ с бэкэнда, то же самое.

Я добавил другие элементы в Listview, и их x: Name тоже не были видны.

NB: Я могу получить доступ к x: Имя элементов управления, которые я вынес за пределы 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>

person Classyk    schedule 28.03.2019    source источник
comment
Я не считаю хорошей идеей иметь имя внутри ViewCell. Вместо этого вы можете захотеть иметь ClassId или StyleId и привязать его к свойству, чтобы вам было проще получить к ним доступ позже.   -  person Amir Hajiha    schedule 29.03.2019
comment
Спасибо, но я не знаю, как это сделать. У вас есть документация, на которую я могу сослаться?   -  person Classyk    schedule 29.03.2019
comment
Что вы имеете в виду под Image IsLoading Property? В элементе управления Image такого свойства нет. Я не понимаю, чего ты хочешь добиться. Может быть, когда ActivityIndicator IsRunning == true, вы хотите, чтобы ваше изображение исчезло или появилось?   -  person Umar3x    schedule 01.04.2019
comment
@ Umar3x Я хочу, чтобы индикатор активности IsRunning был верным, когда мое изображение загружается, и чтобы он исчезал, когда изображение появляется. Как я могу это сделать?   -  person Classyk    schedule 01.04.2019
comment
Вы загружаете свое изображение как ресурс в свой проект или из URI?   -  person Umar3x    schedule 02.04.2019


Ответы (2)


Существует очень хорошая библиотека 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

person Umar3x    schedule 02.04.2019

Вот как ожидается, что все будет работать в технологиях XAML, включая Xamarin.Forms.

Существует не один ViewCell, их могут быть тысячи, и вы не можете получить доступ к тысячам различных элементов с одним именем.

Рекомендуемый способ - использовать привязку данных. Часто вы также можете получить доступ к этим элементам, добавив sender в событиях.

person Ivan Ičin    schedule 28.03.2019
comment
Спасибо, но есть ли у вас документация, на которую я могу сослаться? Я не знаю, как это сделать - person Classyk; 29.03.2019
comment
Спасибо за документацию. Я просмотрел документацию, и оказалось, что это именно то, что я пытался сделать раньше. Если мне нужно выполнить привязку из разметки, мне все равно придется ссылаться на x: name исходного элемента управления. И проблема в том, что я не могу получить доступ к любому элементу управления, который я поместил в DataTemplate ListView через их x: name. Есть ли способ решить эту проблему? и в этом-то и заключается проблема прямо сейчас. Если у вас есть другое решение, любезно предложите их мне, - person Classyk; 29.03.2019
comment
Я решил удалить свой комментарий, так как он звучал несколько высокомерно, но перефразирую его - то, что вы сказали выше, неверно, а это значит, что вам нужно многому научиться. Там есть образец именно с ListView, проверьте его внимательно, и вы поймете, как это нужно делать. - person Ivan Ičin; 30.03.2019