CarouselView не отображается при начальной загрузке страницы, но отображается при горячей перезагрузке XAML

#xaml #xamarin.forms

#xaml #xamarin.forms

Вопрос:

Я пытаюсь добавить CarouselView для отображения изображений, выбранных пользователем со своего устройства. После отладки, после выбора файлов, CarouselView не отображается с выбранными мной изображениями, даже сам фрейм не отображается. Повозившись с XAML, я понял, что CarouselView действительно существует, и когда я просто сохраняю файл XAML во время отладки, запускается горячая перезагрузка XAML, и CarouselView отображается идеально.

Вот мой код XAML для CarouselView:

 <CarouselView x:Name="preview" IsVisible="True" ItemsSource="{Binding Files}">
            <CarouselView.ItemTemplate>
                <DataTemplate>
                    <StackLayout>
                        <Frame  HasShadow="True"
                               IsVisible="True"
                               BorderColor="Black"
                               CornerRadius="5"
                               Margin="20"
                               HeightRequest="500"
                               WidthRequest="500"
                               HorizontalOptions="Center"
                               VerticalOptions="Start">
                            <StackLayout>
                                <Label TextColor="Black" Text="{Binding FileName}"></Label>
                                <Image Source="{Binding FullPath}"
                                       Aspect="AspectFill"
                                       HeightRequest="500"
                                       WidthRequest="500"
                                       VerticalOptions="Center"/>
                            </StackLayout>
                        </Frame>
                    </StackLayout>
                </DataTemplate>
            </CarouselView.ItemTemplate>
        </CarouselView>
 

и вот код, лежащий в основе:

 public FileView( IEnumerable<FileResult> pF)
    {
        InitializeComponent();
        BindingContext = this;
        this.pickedFiles = pF;
    }

    private IEnumerable<FileResult> pickedFiles;
    public IEnumerable<FileResult> Files
    {
        get => pickedFiles;
    }
 

Я использую объект FileResult как часть Xamarin.Плагин Essentials для получения файлов с устройства я успешно привязал путь к файлу и имя файла из каждого файла в CarouselView. Проблемы, с которыми я сталкиваюсь сейчас, заключаются в том, что он не отображается с первой попытки.

Протестировано на устройстве Android, если это поможет.

Ответ №1:

Согласно вашему описанию, я предлагаю вам использовать ObservableCollection<T> вместо IEnumerable<T> , поскольку ObservableCollection реализует интерфейс INotifyPropertyChanged, чтобы уведомлять представление при изменении или обновлении данных.

код, лежащий в основе, вы можете посмотреть:

 public partial class Page2 : ContentPage
{
    public ObservableCollection<FileResult> Files { get; set; }   
    public Page2()
    {
        InitializeComponent();
        Files = new ObservableCollection<FileResult>();
        loaddata();
        this.BindingContext = this;
    }
    private void loaddata()
    {
        Files.Add(new FileResult() { FileName="image 1",FullPath="a5.jpg"});
        Files.Add(new FileResult() { FileName = "image 2", FullPath = "a6.jpg" });
        Files.Add(new FileResult() { FileName = "image 3", FullPath = "a7.jpg" });
        Files.Add(new FileResult() { FileName = "image 4", FullPath = "a8.jpg" });
        Files.Add(new FileResult() { FileName = "image 5", FullPath = "a9.jpg" });
    }
}

public class FileResult
{
    public string FileName { get; set; }
    public string FullPath { get; set; }
}
 

Комментарии:

1. Привет, я пробовал использовать a ObservableCollection<FileResult> , но это все та же проблема, мне нужно выполнить горячую перезагрузку XAML, чтобы увидеть carouselview. Я немного изменил ваш пример кода, чтобы по-прежнему использовать an IEnumerable<T> для заполнения ObservableCollection<T> , а затем ObservableCollection<T> вместо этого получить доступ к моей привязке XAML, но безуспешно.

2. Повозившись еще немного, я изменил положение моего this.BindingContext = this экземпляра, чтобы он находился под моим ObservableCollection<T> экземпляром, и это работает! Я даже пробовал это с оригиналом IEnumerable<T> , и это тоже работает. Оказывается, это была проблема слишком ранней установки BindingContext! Спасибо за помощь, отметив это как ответ