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