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

Xaml GridView在删除项并将其添加到数据集合后更新gui,xaml,win-universal-app,observablecollection,Xaml,Win Universal App,Observablecollection,我试图在GridView中显示用户选择的文件。 以下场景中有一个奇怪的bug(可能在我的代码中): 选择一个图像 ->在GridView中显示图像 拾取第二个图像 ->在GridView中显示图像 选择第三个图像 ->在GridView中显示图像 删除第二个图像 ->图像从GridView中消失 添加第四个图像 ->网格视图显示先前删除的第二幅图像(??) 添加一个额外的图像 ->网格视图显示新图像(??) 有趣的是,我的PageModel集合包含正确的数据 这是我如何将项目添加到集合的一个

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

  • 选择一个图像 ->在GridView中显示图像
  • 拾取第二个图像 ->在GridView中显示图像
  • 选择第三个图像 ->在GridView中显示图像
  • 删除第二个图像 ->图像从GridView中消失
  • 添加第四个图像 ->网格视图显示先前删除的第二幅图像(??)
  • 添加一个额外的图像 ->网格视图显示新图像(??)
有趣的是,我的PageModel集合包含正确的数据

这是我如何将项目添加到集合的一个片段:

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);
以下是我从集合中删除项目的方式:

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。。。(另外,我丢失了所有精美的动画,屏幕闪烁)

这个问题听起来像是当你想要删除一个项目时,你无法真正获取所选项目的数据,因为当项目被添加、删除或整个列表被刷新时,你可以提供通知

每次用户在使用
ObservableCollection类时添加新文件时,无需将全新的集合设置为
GridView

我从单击的按钮DataContext获取“数据”对象

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

主页的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" />

正如我所说的,我无法真正理解如何获取
数据
对象,但我的方法工作得很好。在本演示中,您可以使用文件选择器将图像添加到
GridView
,并通过右键单击一个项目删除图片

PageModel.SelectedMedia.Media.Remove(数据为MyMedia)?这不应该像
PageModel.SelectedMedia.Remove(数据作为MyMedia)谢谢@Stamos这是一个打字错误:)请纠正这个错误。从你的代码中,我找不到你所说的发生的原因。您可以发布更多的方法代码、MyMedia类和DataTemplate的xaml部分吗谢谢,@Grace抱歉,我无法提前回复。。。我会尽量详细解释我的情况。。。但如果有什么遗漏或误导,请回复,我也可以创建一个小样本并分享它。。。我有一个用于显示任何StorageFile用户选择的自定义控件(它只包含两个依赖属性:Title(string)和Source(StorageFile)),现在,该控件被设置为我的GridView的DataTemplate。GridView中的每个元素都有一个弹出式菜单,使用户可以从选择中删除文件(稍后我计划添加其他选项)。从FyloutMenuItem和GridView selectedIndex中,我可以从集合中删除所需的项目。只有当我删除项目并尝试添加新项目时,GridView才会表现出奇怪的行为。。。如果我删除一个项目,我添加的下一个项目将不会显示-它将显示我删除的项目。。。我希望这能澄清我的问题…@evilgugl,我现在下班了,要到下周一才能为你的问题编程。但要使我的代码适应您的代码应该不难,奇怪的是,一个删除的项目再次显示。也许最好和我分享你的样品,然后我会在周一更新我的答案,对你合适吗?有一个愉快的周末!嗨@Grace我终于有时间做一个样本项目来展示困扰我的问题。。。但是有趣的是。。。这个例子很有用。。。所以,我猜我还有其他问题:(非常感谢你的帮助