2つのListViewを備えたWinRTC#アプリがあります。それを表す簡単な方法は、1つのListViewがフォルダーの場所のリストであり、2番目のListViewがそのフォルダー内のディレクトリ構造の詳細を示すことです。
ListView1 ListView2 (Contents of Folder 2)
Folder 1 Folder a
|Folder 2| File a
Folder 3 File b
Folder 4 Folder b
Folder c
File c
File d
そんな感じ。
フォルダのコレクションであるメインのObservableCollectionがあります。各フォルダーには、2番目のListViewで使用されるデータである独自のObservableCollectionが含まれています。
ListView1と2は、基本的に同じようにバインドされます。
ItemsSource="{Binding Source={StaticResource folderViewSource}}"
ItemsSource="{Binding Source={StaticResource fileViewSource}}"
CollectionViewSourcesが次のように定義されている場合:
<!-- The list of folders, used by the main ListView -->
<CollectionViewSource
x:Name="folderViewSource"
Source="{Binding FolderBinding}" />
<!-- The files and folders for a specific folder, used by the Files ListView -->
<CollectionViewSource
x:Name="fileViewSource"
Source="{Binding ElementName=folderListView, Path=SelectedItem.Files}" />
ListView1は正常に読み込まれ、問題はありません。
ListView2は正しくバインドされます(最初のListViewで選択されたフォルダーのファイルが表示されます)が、バインドはUIスレッドで行われます。私のPCでは、不快な場合でも許容できます。私のSurfaceRTでは、2秒かかることがあります。
2番目のListViewで使用されているテンプレートは非常に扱いにくいですが、文字列に絞り込んだだけで、Surfaceではまだ少しぎくしゃくしていました。明らかにUIスレッドから移動する必要があります。
私の最初の考えは、バインディングをXAMLから移動してコードで実行することでしたが、それを改善する方法がわかりませんでした。Windowsは、何をするかに関係なく、UIスレッド上にUI要素を作成しています。
ISupportIncrementalLoadingも調べましたが、これはスクロール時に新しいアイテムを動的にロードするためのもののようです。
私はしばらく立ち往生していて、忙しいことがありましたが、これに戻りたいのですが、これを理解することはできません。うまくいけば、私は明らかな何かが欠けています。