2017-05-24 3 views
0

Ich bin ziemlich neu in TPL und UWP und arbeite mit fileopenpicker Steuerung zusammen mit MVVM. Ich habe eine Suchschaltfläche, auf der ich einen FileOpenPicker öffnen und mehrere Dateien auswählen und dann in der Ansicht (mit ListView) widerspiegeln möchte.FileOpenPicker in Viewmodel spiegelt Änderungen in View nicht wider, nachdem mehrere Dateien ausgewählt wurden

Betrachten Sie den Code-Schnipsel für View:

<Button x:Name="search" Content="select image" RelativePanel.RightOf="imagepath" Command="{x:Bind addProduct.SearchCommand}" 
        Grid.Row="5" Grid.Column="2" Margin="20"></Button> 

    <ListView x:Name="lstImages" Grid.Row="6" Grid.Column="2" DataContext="{Binding addProduct}" > 
      <ListView.ItemTemplate> 
       <DataTemplate > 
        <StackPanel Orientation="Horizontal" > 
         <TextBlock Text="{Binding Name}" Width="100" TextAlignment="Left" > 
         </TextBlock>        
         <ProgressRing Width="20" Height="20" Foreground="Brown" x:Name="progress" IsActive="True" /> 
         <Button Margin="10, 0, 0, 0" Foreground="Brown" x:Name="Delete" Content="Delete" 
           Command="{Binding ElementName=lstImages, Path=DataContext.DeleteCommand }" CommandParameter="{Binding}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

In Ansichtsmodell, ich habe meinen Delegate Befehl initialisieren und dann von der Asynchron-Methode verwenden, um die Dateien auszuwählen.

public AddProductViewModel() 
    { 
     this.SearchCommand = new DelegateCommand(this.SearchFiles); 
    } 

    private async void SearchFiles() 
    { 
     var picker = new FileOpenPicker(); 
     picker.FileTypeFilter.Add(".jpg"); 
     picker.FileTypeFilter.Add(".png"); 
     picker.FileTypeFilter.Add(".jpeg"); 
     picker.ViewMode = PickerViewMode.Thumbnail; 
     picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; 

     var result = await picker.PickMultipleFilesAsync(); 
     var files = new ObservableCollection<StorageFile>(); 
     if (result != null) 
     { 
      foreach (var item in result.ToList()) 
      { 
       files.Add(item); 
      } 
     } 

     this.Files = files; 

     //return files; 
    } 

Die Dateien mit dem Picker ausgewählt sind nicht auf der Ansicht wider, während während der Eigenschaft Speicher Dateien mit den richtigen Daten zum Speichern zur Verfügung steht.

Dank Vorschlag, was ist falsch mit dem Code?

+0

Welcher Typ ist 'this.Files'? –

+0

this.Files ist eine ObservableCollection von StorageFile öffentliche ObservableCollection Dateien {get; set;} –

Antwort

0

Die Antwort ist einfach, die gleiche wie in Dutzenden von Fragen wie diese, nicht belegen zu Ihrer Files Eigenschaft, wenn es nicht nur klar, dass es nicht implementiert INotifyPropertyChanged und verwendet Add die neuen Elemente, um es hinzuzufügen.

var result = await picker.PickMultipleFilesAsync(); 
if (result != null) 
{ 
    Files.Clear() 
    foreach (var item in result.ToList()) 
    { 
     Files.Add(item); 
    } 
} 
+0

Es funktioniert immer noch nicht. Ich denke, das Problem liegt bei der asynchronen Methode, d. H. Suchdateien. Für den Zweck habe ich die ObservationCollection von StorageFile entfernt und ObservableCollection von String verwenden und entfernen Sie die asynchrone Methode, es beginnt zu arbeiten. Aber ich muss StorageFile verwenden, die Inhalt auf der Grundlage der Wartezeitmethode abholen, d. H. Warte auf picker.PickMultipleFilesAsync(); –

+0

Danke Igor. Es fängt gerade an, für mich zu arbeiten. Ich habe x: Bind anstelle von Binding verwendet, nachdem ich die vorgeschlagenen Änderungen vorgenommen habe und es funktioniert. –

Verwandte Themen