Как использовать xaml pivot с асинхронными методами - PullRequest
0 голосов
/ 23 июня 2019

Я использую элемент управления 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?

Спасибо

1 Ответ

0 голосов
/ 24 июня 2019

Использование ObservableCollection решит эту проблему.Класс List не реализовал интерфейс INotifyPropertyChanged , он не будет уведомлять пользовательский интерфейс при его обновлении.

public ObservableCollection<VideoModel> AllVideos = new ObservableCollection<VideoModel>();
...