选择多个文件后,Viewmodel中的FileOpenPicker不会反映View中的更改

时间:2017-05-24 07:08:46

标签: c# uwp synchronization task-parallel-library uwp-xaml

我是TPL和UWP的新手,并且与MVVM一起使用fileopenpicker控件。我有一个搜索按钮,我想在其上打开FileOpenPicker并选择多个文件,然后将其反射回视图(使用ListView)。

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

在ViewModel中,我初始化了Delegate命令,然后使用async方法选择文件。

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

使用选择器选择的文件不会反映在视图中,而在保存期间,可以使用正确的数据保存属性文件

感谢提供建议,代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

答案很简单,就像这样的几十个问题一样,如果Files属性没有实现INotifyPropertyChanged,请不要将其分配给Add,只需清除它并使用var result = await picker.PickMultipleFilesAsync(); if (result != null) { Files.Clear() foreach (var item in result.ToList()) { Files.Add(item); } } 即可添加新项目。

#include <stdio.h>
#include <vector>
template <typename T>
class Printer{
public:
    static void print(T& v){
        printf("%d ",v.getValue());
    }
};

template <typename T,typename Alloc>
class Printer<std::vector<T,Alloc> >{
public:
    static void print(std::vector<T,Alloc>& v){
        for(T& e : v){
            Printer<T>::print(e);
        }
        printf("\n");
    }
};