Как получить обновление на CollectionViewSource.View.Count в UWP - PullRequest
0 голосов
/ 05 ноября 2019

Я извлекаю свойство FileInformation.DisplayName примерно 5k файлов в папке, используя FileInformationFactory.GetVirtualizedFilesVector(), чтобы отобразить их в GridView в UWP через CollectionViewSource. Пока работает дисплей, мне не удается получить правильное количество найденных элементов. Я знаю, что могу сделать это, ожидая GetFilesAsync и считая, но это убивает цель скорости использования виртуализированного вектора, и, следовательно, я бы хотел этого избежать.

Вот XAML

    xmlns:ba="using:Windows.Storage.BulkAccess"


    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <StackPanel Margin="16">
        <StackPanel Orientation="Horizontal">
            <AppBarButton Icon="Folder" Click="AppBarButton_Click" LabelPosition="Collapsed"/>
            <AppBarButton Icon="Refresh" Click="RefreshAppBarButton_Click" LabelPosition="Collapsed"/>
        </StackPanel>
        <TextBlock x:Name="infoTextBlock" FontWeight="Medium"/>
    </StackPanel>


    <GridView Grid.Row="1" Grid.Column="1"
              ItemsSource="{x:Bind FileCollectionViewSource.View, Mode=OneWay}">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="ba:FileInformation">
                    <TextBlock Text="{x:Bind DisplayName}"/>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
</Grid>

И код

    private StorageFolder _folder;
    public CollectionViewSource FileCollectionViewSource { get; set; } = new CollectionViewSource();

    private async void AppBarButton_Click(object sender, RoutedEventArgs e)
    {
        var folderPicker = new FolderPicker
        {
            SuggestedStartLocation = PickerLocationId.PicturesLibrary,
            ViewMode = PickerViewMode.Thumbnail
        };

        folderPicker.FileTypeFilter.Add("*");

        _folder = await folderPicker.PickSingleFolderAsync();
        if (_folder != null)
        {
            GetFileVectors();
        }
        else
        {
            infoTextBlock.Text = "Pick folder";
        }
    }

    private void GetFileVectors()
    {
        var queryOptions = new QueryOptions
        {
            FolderDepth = FolderDepth.Deep,
            IndexerOption = IndexerOption.UseIndexerWhenAvailable
        };

        var fileQuery = _folder.CreateFileQueryWithOptions(queryOptions);

        var fileInformationFactory = new FileInformationFactory(fileQuery, ThumbnailMode.SingleItem, Constants.Thumbnail_Size,
            ThumbnailOptions.UseCurrentScale, false);
        var filesVector = fileInformationFactory.GetVirtualizedFilesVector();

        FileCollectionViewSource.Source = filesVector;

        var count = FileCollectionViewSource.View.Count;
        infoTextBlock.Text = $"View count {count}";//Returns 0
    }

    private void RefreshAppBarButton_Click(object sender, RoutedEventArgs e)
    {
        infoTextBlock.Text = $"View count {FileCollectionViewSource.View.Count}";//returns the correct count
    }

Результаты: Когда я выбираю папку, вызывается метод GetFileVectors (), он выполняет массовый поиск и устанавливает FileCollectionViewSource.Source = filesVector;, а FileCollectionViewSource.ViewOneWay привязан к GridView. Однако FileCollectionViewSource.View.Count возвращает 0 на этом этапе. Если сейчас я нажму на кнопку обновления RefreshAppBarButton_Click, то будет возвращено точное количество.

Я могу себе представить, что FileCollectionViewSource.View нужно некоторое время для урегулирования, и, действительно, установка await Task.Delay(1000) перед печатью FileCollectionViewSource.View.Countработает, но я ищу способ обновить TextBlock, когда FileCollectionViewSource.View сделано.

Есть ли способ сделать это автоматически по какому-либо событию или другому? Спасибо!

1 Ответ

0 голосов
/ 05 ноября 2019

После Nico Zhu - MSFT, запустить событие после того, как источник был установлен FileCollectionViewSource.View.VectorChanged += View_VectorChanged;

затем

  private void View_VectorChanged(IObservableVector<object> sender, IVectorChangedEventArgs @event)
    {
        if (@event.CollectionChange == CollectionChange.Reset)
        {
            infoTextBlock.Text = $"{FileCollectionViewSource.View.Count} ";//returns the correct count
        }
    }
...