Вопрос

Я использую список для отображения элементов в списке. Пользователь может выбрать сам элементы или использовать некоторые «Prevelct Keys», чтобы выбрать элементы с указанными атрибутами.

Чтобы проверить предметы, которые я использую что-то подобное:

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. Я слышал, что это что-то связано с виртуализацией, и что список не знает о предметах сниматься или вниз «поле зрения». Но как приходит, что можно выбрать элементы в списке офсайд «Поле зрения», когда вы выбираете их вручную?

И как сделать выбор предмета за пределами «поля зрения»? Я думаю, что это должно быть возможно.

Спасибо за любую помощь, отмечает

Это было полезно?

Решение

Как вы упомянули, я предполагаю, что проблема является виртуализацией элементов ListView. По умолчанию использование listView (и listbox) VirtualizingStackPanel как их элементыPanel для повышения производительности. Краткое объяснение того, как это работает, можно прочитать здесь.

Однако вы можете заменить другую панель. В этом случае попробуйте использовать нормальный стекPanel. Если у вас есть тонна предметов в ListView, особенно если они являются сложными элементами, производительность может немного пострадать.

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

Редактировать

Вы также можете попробовать описать решение На этот подобный вопрос, в зависимости от вашей модели. Однако это, вероятно, не будет работать для вас.

Другие советы

При работе с элементами управления виртуализацией элементов альтернатива для отключения виртуализации (которая на самом деле является полезной функцией иногда, даже если она мешает правильной работе других частей 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;
}

Я не очень доволен необходимостью поиска по визуальному дереву, чтобы найти панель, но я не знаю о любом другом способе получения его, ни для прокрутки до определенного индекса при работе с виртуализирующей панелью.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top