2016-03-03 119 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,我現在下班了,不能編程爲您的問題,直到下週一。但是讓我的代碼適合你的應該不難,奇怪的是再次顯示一個被刪除的項目。也許最好把你的樣本分享給我,然後我會在星期一更新我的答案,對你來說這樣可以嗎?週末愉快! –