私がやろうとしているのは、ファイルのコレクションを(非同期的に)取得し、ファイル名の最初の文字でグループ化された GridView に表示することです。
たとえば、ファイルの名前が「Pic」の場合、これはタイトル「P」内の列の下に表示されます。
以下は私のView Modelのコードです:
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}">
ビルドして実行すると、画面に何も表示されません。ただし、次の理由により、コードがほぼ機能していることはわかっています。
- コンストラクターで Construct() の呼び出しを削除し、いくつかの File オブジェクトを Files コレクションにハードコードするコードに置き換えると
、目的の出力が生成されます。 - CollectionViewSource の使用を削除し、GridView を Files コレクションに直接バインドすると (さらに非同期コードを使用して)、画面にコレクションが表示されますが、もちろん、Items の使用がバイパスされる (および GridView を Items にバインドする) ため、コレクションはフィルター処理されません。結果も出ません)
これは、Items コレクションに変更通知がないため、最初の読み込み後に非同期呼び出しが実行されているため、コレクションが画面に更新されていないことが原因であると考えられます。
なぜこれが起こっているのか、および/または修正に関するアドバイスを誰かが知っていますか?
どうもありがとう!