Я использую элемент управления pivot для отображения содержимого коллекции видео, полученных с помощью асинхронного метода.
У меня есть 2 сводных элемента, один для избранного, в котором будут элементы, которые пользователь выберет в другом сводном списке, в котором перечислены все видео.
Прямо сейчас у меня есть рабочий файл xaml. Файл выглядит так
<Grid.RowDefinitions>
<RowDefinition Height = "auto"/>
<RowDefinition Height = "*"/>
</Grid.RowDefinitions>
<TextBlock Text="Video" FontSize="30" Margin="10,0,0,0"/>
<Pivot Grid.Row = "1">
<PivotItem Header="Favorite Videos">
<ItemsControl ItemsSource="{x:Bind ViewModel.FavoriteVideos, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:VideoModel">
<Grid Height="40">
<TextBlock VerticalAlignment="Center" Text="{x:Bind Title}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</PivotItem>
<PivotItem Header="All Videos" >
<ItemsControl ItemsSource="{x:Bind ViewModel.AllVideos, Mode=OneWay}" >
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="models:VideoModel">
<StackPanel Orientation="Horizontal">
<Image Source="{x:Bind Cover}" HorizontalAlignment="Left" Width="100"/>
<TextBlock VerticalAlignment="Center" Text="{x:Bind Title}"/>
<ToggleSwitch Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Center" IsOn="{x:Bind IsFavorite, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</PivotItem>
</Pivot>
</Grid>
Код для ViewModel.AllVideos это:
namespace VideoManager.ViewModels
{
public class VideoViewModel
{
public List<VideoModel> AllVideos = new List<VideoModel>();
public ObservableCollection<VideoModel> FavoriteVideos = new ObservableCollection<VideoModel>();
public VideoViewModel()
{
InitVideos();
}
private async void InitVideos()
{
var files = await KnownFolders.VideosLibrary.GetFilesAsync();
foreach (var file in files)
{
if (file != null)
{
var thumbnail = await file.GetThumbnailAsync(ThumbnailMode.VideosView, 50, ThumbnailOptions.ReturnOnlyIfCached);
VideoModel video = new VideoModel();
video.PropertyChanged += IsFavoritePropertyChanged;
video.Title = file.Name;
if (thumbnail != null)
{
BitmapImage bitmapImage = new BitmapImage();
InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
await RandomAccessStream.CopyAsync(thumbnail, randomAccessStream);
randomAccessStream.Seek(0);
await bitmapImage.SetSourceAsync(randomAccessStream);
video.Cover = bitmapImage;
}
AllVideos.Add(video);
if (video.IsFavorite)
{
FavoriteVideos.Add(video);
}
}
}
}
public void IsFavoritePropertyChanged(object sender, PropertyChangedEventArgs e)
{
VideoModel toggledVideo = sender as VideoModel;
if (toggledVideo.IsFavorite)
{
FavoriteVideos.Add(toggledVideo);
}
else
{
FavoriteVideos.Remove(toggledVideo);
}
}
}
}
Работает нормально, но если я изменю порядок PivotItem и поставлю PivotItem All videos до PivotItem FavoriteVideos, то на экране ничего не появится. Я думаю, это как-то связано с асинхронным методом.
Итак, мой вопрос: как заставить эту работу работать независимо от порядка PivotItem?
Спасибо