2016-03-03 109 views
0

我试图显示用户在GridView中选择的文件。 有一个奇怪的错误(也许是在我的代码)在以下情形:GridView更新gui删除并添加项目到数据集合

  • 选择一个图像 - >显示在GridView图像
  • 接第二图像 - >显示在GridView
  • 挑选图片第三图像 - >示出了在GridView
  • 图像删除第二图像 - 在GridView
  • >图像消失添加第四图像 - >GridView控件显示先前删除第2幅图像(??)
  • 添加一个额外的图像 - >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; 
    }; 
} 

这就是我如何REM从集合奥雅纳项目:

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

我从点击按钮的DataContext的“数据”对象......

任何人都可以请帮我这个错误?

我不希望每一次的品牌新的集合设置到GridView用户添加一个新的文件。(另外,我失去了所有花哨的动画和屏幕闪烁)

+0

'PageModel.SelectedMedia.Media.Remove(data as MyMedia);'?不应该这样像'PageModel.SelectedMedia.Remove(数据为MyMedia);' – Stamos

+0

谢谢@Stamos 这是一个错字:) –

+0

请修复错字。从你的代码我无法找到你说的事情发生的原因。你可以发布更多你的方法代码,MyMedia类和DataTemplate的xaml部分 – Stamos

回答

0

这个问题听起来像当您想要删除选定项目的数据时,由于ObservableCollection Class可以在项目添加,删除或整个列表刷新时提供通知。

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

我从点击按钮的DataContext的“数据”对象......

我不是很明白你的意思这句话什么,而是根据你的发布代码,我写了一个小在这里演示,它和你的代码不完全一样,但你可以看看。的MainPage的

XAML代码:的MainPage的

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

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

而且在PageModel文件夹中的MyMedia类:

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

正如我所说的,我可以真的不明白你是如何得到你的data对象,但我的方法工作正常。在本演示中,您可以使用文件选取器将图像添加到GridView,并通过右键单击一个项目来删除图片。

+0

谢谢,@Grace 对不起,我以前不能回复... 我会尽量解释一下我的情况。 ..但如果有什么缺失或误导,请回复,我也可以创建一个小样本,并分享它... 我有一个显示任何StorageFile用户选择的自定义控件(它只包含2个依赖项属性:标题(字符串)和源(StorageFile)) 现在,这个控件被设置为我的GridView的DataTemplate。 还有一个FlyoutMenu附加到GridView中的每个元素,使用户能够从选择中删除文件(稍后我打算添加其他选项) 。 –

+0

从该FyloutMenuItem和GridView selectedIndex我可以从我的集合中删除所需的项目。 只有当我删除的项目,并尝试添加新的...如果我删除一个项目,我添加的下一个项目将不会显示 - 它会显示一个我删除... 我希望这澄清了我的问题... –

+0

@evilgugl,我现在下班了,不能编程为您的问题,直到下周一。但是让我的代码适合你的应该不难,奇怪的是再次显示一个被删除的项目。也许最好把你的样本分享给我,然后我会在星期一更新我的答案,对你来说这样可以吗?周末愉快! –