我是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;
}
使用选择器选择的文件不会反映在视图中,而在保存期间,可以使用正确的数据保存属性文件。
感谢提供建议,代码出了什么问题?
答案 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");
}
};