2012-09-17 61 views
1

我試圖做的是檢索文件的集合(異步),然後顯示在由文件名的第一個字母組成的GridView中。GridView不顯示已通過CollectionViewSource異步檢索的數據

例如,如果一個文件被稱爲「Pic」,這將顯示在標題「P」內的列下。

下面是從我的視圖模型的一些代碼:

public ObservableCollection<File> Files { get; set; } 
public List<FileCategory> Items { get; set; } 
private FileRepository _fileRepository; 
public MoviesPageViewModel() 
{ 
     _fileRepository = new FileRepository(); 
     this.Construct(); 
     var filesByCategories = Files.GroupBy(x => x.Title[0].ToString()) 
      .Select(x => new FileCategory { Title = x.Key, Items = new ObservableCollection<File>(x)}); 
     Items = filesByCategories.ToList(); 
} 
private async void Construct() 
    { 
     Files = new ObservableCollection<File>(); 
     IList _files = await _fileRepository.GetFiles(); 
     foreach (File file in _files) 
     { 
      Files.Add(file); 
     } 
    } 

這裏是CollectionViewSource從視圖

<CollectionViewSource 
     x:Name="groupedItemsViewSource" 
     Source="{Binding Items}" 
     IsSourceGrouped="true" 
     ItemsPath="Items"/> 

而且,在同一視圖GridView控件(減去模板)

<GridView 
    x:Name="itemGridView" 
    AutomationProperties.AutomationId="ItemGridView" 
    AutomationProperties.Name="Grouped Items" 
    Margin="116,0,40,46" 
    ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}" 
    ItemTemplate="{StaticResource Standard250x250ItemTemplate}"> 

當我建立並運行時,屏幕上什麼都沒有。但是,我知道這些代碼是靠近工作,因爲:

  1. 卸下調用構建()在構造和使用一些代碼替換它 硬編碼的幾個文件對象到文件
    集生產期望的輸出。
  2. 取出使用CollectionViewSource和 GridView控件直接綁定到該文件收集(仍然使用異步 代碼)呈現在屏幕上集合,當然他們不是 過濾,因爲這bypases使用項目(和GridView控件 結合項目不產生任何結果要麼)

我認爲,這可能是因爲我的項目集合沒有任何變化通知,以便收集不updading篩選的異步調用後,攜帶上初始負載。

是否有人知道爲什麼會發生這種情況並/或提供有關修復的任何建議?

非常感謝!

回答

0

我通過進行一些更改來實現此目的。

我將Items集合放入ObservableCollection中,然後移動linq查詢並將查詢結果添加到async Construct方法。

這感覺很混亂,但它現在的作品。謝謝大家!

+0

按原樣,在開始構建之後,您正在執行linq查詢,但尚未完成。如果你想保持Construct之外的查詢,你會希望它返回Task而不是void,然後ContinueWith查詢(不能等待ctor)或者創建一個新的異步包裝方法來等待Construct()然後執行查詢。後者是可取的,因爲延續需要發生在我想象的UI線程上。 –

0

的問題是,CollectionViewSource綁定到Items收集和要添加項目到Files收集

要麼改變你的代碼添加到Items或更改您的XAML指向Files

你可能還需要調用Add操作

+0

嘿!謝謝您的回答。 我相信CollectionViewSource應該指向Items。正如您在MoviesPageViewModel的構造函數中所看到的那樣,我將分配包含一組鍵/ Items集合的filesByCategories linq結果。 如果我將某些File對象硬編碼到Files集合中而不是調用異步代碼,UI就會正確渲染(只是使用硬編碼值) – lookitskris

+0

LINQ to Objects不是「活」的 - 您不會看到可觀察的集合的LINQ,所以更新不會流向控件。 –

相關問題