如何在UWP中获取CollectionViewSource.View.Count的更新

我正在使用FileInformation.DisplayName检索文件夹中大约5k文件的FileInformationFactory.GetVirtualizedFilesVector()属性,以通过CollectionViewSource在UWP的GridView中显示它们。当显示正常时,我无法正确获取已检索到的项目数。 我知道我可以通过等待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.View被绑定到OneWay的{​​{1}}上。但是,GridView在此阶段返回0。 如果现在单击刷新按钮FileCollectionViewSource.View.Count,则返回准确的计数。

我可以想象RefreshAppBarButton_Click需要一些时间来解决,并且确实在打印出FileCollectionViewSource.View之前设置await Task.Delay(1000)是可行的,但是我正在寻找一种更新{{1 }}完成FileCollectionViewSource.View.Count后。

是否可以通过某种事件或其他方式自动执行此操作? 谢谢!

colby63 回答:如何在UWP中获取CollectionViewSource.View.Count的更新

跟随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
        }
    }
本文链接:https://www.f2er.com/3160879.html

大家都在问