1

我有一个带有两个 ListViews 的 WinRT C# 应用程序。一种简单的表示方法是,一个 ListView 是文件夹位置的列表,第二个 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,它是文件夹的集合。每个文件夹都包含自己的 ObservableCollection,也就是第二个 ListView 中使用的数据。

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 线程上完成的。在我的电脑上,如果不愉快是可以容忍的。在我的 Surface RT 上,这可能需要 2 秒。

第二个 ListView 中使用的模板非常繁琐,但我将它过滤成一个字符串,它在 Surface 上仍然有点生涩——显然我需要将它移出 UI 线程。

我的第一个想法是将绑定从 XAML 中移开并在代码中进行,但我看不到任何改进它的方法 - 无论我做什么,Windows 仍在 UI 线程上创建 UI 元素。

我还查看了 ISupportIncrementalLoading 但这似乎是为了在滚动时动态加载新项目等。

我已经被困了一段时间,我有一些事情让我很忙,但我想回到这个,但我想不通。希望我遗漏了一些明显的东西。

4

0 回答 0