Home > Enterprise >  WPF - Windows Media Import Importable Item List View Data Binding
WPF - Windows Media Import Importable Item List View Data Binding

Time:10-26

I am using the Windows Media Import API in a WPF Application using 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.

Main Window XAML

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>
Code Behind
 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;
    }

CodePudding user response:

Remove "ImportableItem" from the binding paths in the XAML markup:

<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>

When it comes to displaying the thumbnail in an Image element, you need to convert the returned IRandomAccessStreamReference:

Bind XAML Image to IRandomAccessStreamReference

  • Related