我試圖做的是檢索文件的集合(異步),然後顯示在由文件名的第一個字母組成的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}">
當我建立並運行時,屏幕上什麼都沒有。但是,我知道這些代碼是靠近工作,因爲:
- 卸下調用構建()在構造和使用一些代碼替換它 硬編碼的幾個文件對象到文件
集生產期望的輸出。 - 取出使用CollectionViewSource和 GridView控件直接綁定到該文件收集(仍然使用異步 代碼)呈現在屏幕上集合,當然他們不是 過濾,因爲這bypases使用項目(和GridView控件 結合項目不產生任何結果要麼)
我認爲,這可能是因爲我的項目集合沒有任何變化通知,以便收集不updading篩選的異步調用後,攜帶上初始負載。
是否有人知道爲什麼會發生這種情況並/或提供有關修復的任何建議?
非常感謝!
按原樣,在開始構建之後,您正在執行linq查詢,但尚未完成。如果你想保持Construct之外的查詢,你會希望它返回Task而不是void,然後ContinueWith查詢(不能等待ctor)或者創建一個新的異步包裝方法來等待Construct()然後執行查詢。後者是可取的,因爲延續需要發生在我想象的UI線程上。 –