1

我正在使用 ListView 来显示列表中的项目。用户可以自己选择项目,或者使用一些“预选键”来选择具有指定属性的项目。

要检查我使用类似的项目:

for(int i;i<MyListView.Items.Count;++i)
{
    if( /*... Check if the items should be selected ...*/ )
        (MyListView.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem).IsSelected = true;
}

这对于在执行时可见的项目非常有效。但是对于不可见的项目,ContainerFromIndex() 返回 null。我听说这与虚拟化有关,并且 List 不知道“视野”的上侧或下侧项目。但是,当您手动选择列表中的项目时,为什么会超出“视野”?

以及如何选择“视野”之外的项目?我认为这一定是可能的。

感谢您的帮助,马克斯

4

2 回答 2

2

正如您所提到的,我的猜测是问题是 ListView 项目的虚拟化。默认情况下,ListView(和 ListBox)VirtualizingStackPanel用作它们的 ItemsPanel 以提高性能。可以在此处阅读有关其工作原理的简要说明。

但是,您可以替换另一个面板。在这种情况下,请尝试使用普通的 StackPanel。如果 ListView 中有大量项目,特别是如果它们是复杂项目,性能可能会受到一点影响。

<ListView>
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

编辑

您也可以尝试在此类似问题中描述的解决方案,具体取决于您的型号。但是,这可能对您不起作用。

于 2010-05-11T11:17:12.667 回答
0

在处理虚拟化项目控件时,禁用虚拟化(实际上有时这是一个有用的功能,即使它会干扰 API 其他部分的正确操作)的替代方法是找到VirtualizingPanel并明确告诉它滚动。

例如:

void ScrollToIndex(ListBox listBox, int index)
{
    VirtualizingPanel panel = FindVisualChild<VirtualizingPanel>(listBox);

    panel.BringIndexIntoViewPublic(index);
}

static T FindVisualChild<T>(DependencyObject o) where T : class
{
    T result = o as T;

    if (result != null)
    {
        return result;
    }

    int childCount = VisualTreeHelper.GetChildrenCount(o);

    for (int i = 0; i < childCount; i++)
    {
        result = FindVisualChild<T>(VisualTreeHelper.GetChild(o, i));

        if (result != null)
        {
            return result;
        }
    }

    return null;
}

我对搜索可视化树以查找面板的需要不是很满意,但我不知道有任何其他方法可以获取它,也不知道在处理虚拟化面板时滚动到特定索引。

于 2016-05-26T01:06:51.680 回答