删除GridView后更新gui并将项添加到数据集合中

时间:2016-03-03 19:16:03

标签: xaml win-universal-app observablecollection

我试图在GridView中显示用户选择的文件。 在以下场景中存在一个奇怪的错误(可能在我的代码中):

  • 选择一张图片 - >在GridView中显示图像
  • 选择第二张图片 - >在GridView中显示图像
  • 选择第三张图片 - >在GridView中显示图像
  • 删除第二张图片 - >图像从GridView
  • 中消失
  • 添加第四张图片 - > GridView显示先前删除的第二张图片(??)
  • 添加额外的图片 - > GridView显示新图像(??)

有趣的是,我的PageModel集合包含正确的数据......

这是我如何添加项目tocollection的片段:

var file = await filePicker.PickSingleFileAsync();
using (var stream = await file.OpenAsync(FileAccessMode.Read))
{
    var img = new BitmapImage();
    await img.SetSourceAsync(stream);

    PageModel.SelectedMedia.Add(new MyMedia
    {
        Title = file.DisplayName;
        Source = img;
    };
}

这就是我从集合中删除项目的方法:

PageModel.SelectedMedia.Media.Remove(data as MyMedia);

我收到了数据'来自单击按钮DataContext的对象......

有人可以帮我解决这个错误吗?

每次用户添加新文件时,我都不希望为GridView设置全新的收藏......(另外,我丢失了所有精美的动画和屏幕闪烁)

1 个答案:

答案 0 :(得分:0)

这个问题听起来像你想要删除一个项目时无法真正获得所选项目的数据,因为ObservableCollection Class可以在项目被添加,删除或刷新整个列表时提供通知。 / p>

每次用户在使用GridView时添加新文件时,您都不需要将全新的收藏集设置为ObservableCollection Class

  

我从点击的按钮DataContext中获取'data'对象...

我不太明白你对这句话的意思,但根据你发布的代码,我在这里写了一个小的演示,它与你的代码完全相同,但是你可以看看。

MainPage的XAML代码:

<GridView x:Name="gridView" Grid.Row="0">
    <GridView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Vertical" Width="200" Height="200" RightTapped="OnDelete">
                <TextBlock Text="{Binding Title}" />
                <Image Source="{Binding Source}"  Margin="20,20,0,0" />
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>
<Button VerticalAlignment="Center" HorizontalAlignment="Stretch" Grid.Row="1" Content="Add Picture" Click="OnAdd" />

MainPage的C#代码:

private PageModel.MyMedia MyMedia = new PageModel.MyMedia();
public ObservableCollection<MyMedia> SelectedMedia = new ObservableCollection<MyMedia>();

public MainPage()
{
    this.InitializeComponent();
    gridView.ItemsSource = SelectedMedia;
}

private async void OnAdd(object sender, RoutedEventArgs e)
{
    FileOpenPicker openPicker = new FileOpenPicker();
    openPicker.ViewMode = PickerViewMode.Thumbnail;
    openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
    openPicker.FileTypeFilter.Add(".jpg");
    openPicker.FileTypeFilter.Add(".jpeg");
    openPicker.FileTypeFilter.Add(".png");

    StorageFile file = await openPicker.PickSingleFileAsync();
    if (file != null)
    {
        using (var stream = await file.OpenAsync(FileAccessMode.Read))
        {
            var img = new BitmapImage();
            await img.SetSourceAsync(stream);
            SelectedMedia.Add(new MyMedia
            {
                Title = file.Name,
                Source = img
            });
        }
    }
    else
    {
    }
}

private void OnDelete(object sender, RightTappedRoutedEventArgs e)
{
    var data = (sender as StackPanel).DataContext as MyMedia;
    SelectedMedia.Remove(data);
}

MyMedia文件夹中的PageModel类:

 public class MyMedia
 {
     public string Title { get; set; }
     public BitmapImage Source { get; set; }
 }

正如我所说,我无法理解你如何获得data对象,但我的方法运行正常。在此演示中,您可以使用文件选择器将图像添加到GridView,并通过右键单击一个项目来删除图片。