2017-05-24 3 views
0

TPLとUWPの新機能で、MVVMと一緒にfileopenpickerコントロールを使用しています。検索ボタンがあり、FileOpenPickerを開き、複数のファイルを選択し、ListViewを使用してビューに戻したいと思っています。ViewModelのFileOpenPickerは、複数のファイルを選択した後にViewの変更を反映しません。

は、ビューのコードスニペット考えてみましょう:ViewModelにで

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

を、私は私の委任コマンドを初期化してからファイルを選択するために、非同期メソッドを使用しています。プロパティの保存時にしながら、ピッカーを使用して選択

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

ファイルは、ビューに反映されていないファイルは、正しいデータを保存するために利用可能です。

提案をお寄せいただきありがとうございます。コードの何が間違っていますか?

+0

「this.Files」とはどのようなタイプですか? –

+0

this.FilesはStorageFileのObservableCollectionです public ObservableCollection ファイル{get; set;} –

答えて

0

回答は簡単です。このような質問の数十と同じですが、INotifyPropertyChangedを実装していない場合はFilesプロパティに割り当てずに、Addを使用して新しい項目を追加してください。

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

これはまだ動作しません。問題は非同期メソッド、つまりSearchFilesにあると思います。 目的のために、私はStorageFileのObservationCollectionを削除し、ObservableCollectionをStringとして使用して非同期メソッドを削除しています。 しかし、私は、待機メソッドに基づいてコンテンツを選択する、すなわちpicker.PickMultipleFilesAsync()を待つStorageFileを使用する必要があります。 –

+0

ありがとうございました。それはちょうど私のために働き始める。私はあなたの提案した変更を行った後、私のビューでバインディングの代わりにx:Bindを使っています。 –

関連する問題