WPF - Windows 媒体导入可导入项列表视图数据绑定

WPF - Windows Media Import Importable Item List View Data Binding

我在使用 Microsoft Docs import-media-from-a-device as an example. I have nearly got it working now but have yet to get the data binding working to provide the list of importable items so any help with this would be much appreciated. The source code can be downloaded here.

的 WPF 应用程序中使用 Windows 媒体导入 API

主要WindowXAML

enter<Window x:Class="ImportProofOfConcept.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ImportProofOfConcept"
    mc:Ignorable="d"
    Title="Media Import" Height="450" Width="800" Loaded="Window_Loaded">
<Grid Margin="6">
    <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="*"/>
        <RowDefinition Height="50"/>
        <RowDefinition Height="30"/>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <StackPanel Grid.ColumnSpan="3">
        <Label  Content="Select the required source to import photos and videos from and then select the required files and click OK."/>
        <Label  Content="Source:"/>
        <ComboBox x:Name="CboSources" SelectionChanged="CboSources_SelectionChanged"/>
        <Label  Content="Files:"/>
    </StackPanel>
    <ListView Grid.Row="1" Grid.ColumnSpan="3" MinHeight="10"  VerticalAlignment="Stretch" x:Name="fileListView" 
                HorizontalAlignment="Left" Margin="10,11,0,21" 
                Width="756" 
                BorderBrush="#FF858585"   
                BorderThickness="1" 
                ScrollViewer.VerticalScrollBarVisibility="Visible">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="0.05*"/>
                        <ColumnDefinition Width="0.20*"/>
                        <ColumnDefinition Width="0.75*"/>
                    </Grid.ColumnDefinitions>
                    <CheckBox Grid.Column="0" IsChecked="{Binding IsSelected, Mode=TwoWay}" />
                    <Image Grid.Column="1" Source="{Binding Thumbnail}" Width="120" Height="120" Stretch="Uniform"/>
                    <TextBlock Grid.Column="2" Text="{Binding Name}" VerticalAlignment="Center" Margin="10,0"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Grid.Row="2" Grid.Column="1" Click="ButtonOK_Click" IsDefault="True" Margin="6">OK</Button>
    <Button Grid.Row="2" Grid.Column="2" Click="ButtonCancel_Click" IsCancel="True" Margin="6">Cancel</Button>
    <ProgressBar Grid.Row="3"  Grid.ColumnSpan="3" x:Name="progressBar" SmallChange="0.01" LargeChange="0.1" Maximum="1"/>
</Grid>
代码隐藏
 private async void FindItems()
    {
        this.cts = new CancellationTokenSource();

        try
        {
            this.importSession = this.importSource.CreateImportSession();

            // Progress handler for FindItemsAsync
            var progress = new Progress<uint>((result) =>
            {
                System.Diagnostics.Debug.WriteLine(String.Format("Found {0} Files", result.ToString()));
            });

            this.itemsResult =
                await this.importSession.FindItemsAsync(PhotoImportContentTypeFilter.ImagesAndVideos, PhotoImportItemSelectionMode.SelectAll)
                .AsTask(this.cts.Token, progress);

            // GeneratorIncrementalLoadingClass is used to incrementally load items in the Listview view including thumbnails
            this.itemsToImport = new GeneratorIncrementalLoadingClass<ImportableItemWrapper>(this.itemsResult.TotalCount,
            (int index) =>
            {
                return new ImportableItemWrapper(this.itemsResult.FoundItems[index]);
            });

            // Set the items source for the ListView control
            this.fileListView.ItemsSource = this.itemsToImport;

            // Log the find results
            if (this.itemsResult != null)
            {
                var findResultProperties = new System.Text.StringBuilder();
                findResultProperties.AppendLine(String.Format("Photos\t\t\t :  {0} \t\t Selected Photos\t\t:  {1}", itemsResult.PhotosCount, itemsResult.SelectedPhotosCount));
                findResultProperties.AppendLine(String.Format("Videos\t\t\t :  {0} \t\t Selected Videos\t\t:  {1}", itemsResult.VideosCount, itemsResult.SelectedVideosCount));
                findResultProperties.AppendLine(String.Format("SideCars\t\t :  {0} \t\t Selected Sidecars\t:  {1}", itemsResult.SidecarsCount, itemsResult.SelectedSidecarsCount));
                findResultProperties.AppendLine(String.Format("Siblings\t\t\t :  {0} \t\t Selected Sibilings\t:  {1} ", itemsResult.SiblingsCount, itemsResult.SelectedSiblingsCount));
                findResultProperties.AppendLine(String.Format("Total Items Items\t :  {0} \t\t Selected TotalCount \t:  {1}", itemsResult.TotalCount, itemsResult.SelectedTotalCount));
                System.Diagnostics.Debug.WriteLine(findResultProperties.ToString());
            }

            if (this.itemsResult.HasSucceeded)
            {
                // Update UI to indicate success
                System.Diagnostics.Debug.WriteLine("FindItemsAsync succeeded.");
            }
            else
            {
                // Update UI to indicate that the operation did not complete
                System.Diagnostics.Debug.WriteLine("FindItemsAsync did not succeed or was not completed.");
            }
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("Photo import find items operation failed. " + ex.Message);
        }


        this.cts = null;
    }

从 XAML 标记的绑定路径中删除“ImportableItem”:

<ListView Grid.Row="1" Grid.ColumnSpan="3" MinHeight="10" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" x:Name="LstItems">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.05*"/>
                    <ColumnDefinition Width="0.20*"/>
                    <ColumnDefinition Width="0.75*"/>
                </Grid.ColumnDefinitions>
                <CheckBox Grid.Column="0" IsChecked="{Binding IsSelected, Mode=TwoWay}" Click="CheckBox_Click"/>
                <TextBlock Grid.Column="2" Text="{Binding Name}" VerticalAlignment="Center" Margin="10,0"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

当涉及到在Image元素中显示缩略图时,需要将返回的IRandomAccessStreamReference:

转换为

Bind XAML Image to IRandomAccessStreamReference