Как программно выбрать ВСЕ критерии соответствия строк в DataGrid - PullRequest
0 голосов
/ 11 сентября 2018

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

Мой код выглядит так:

private void HighlightSelections(string selection, int colIndex)
{
    mtoDG.UnselectAll();
    for(int i = 0; i < mtoDG.Items.Count; i++)
    {
        DataGridRow row = mtoDG.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
        if (mtoDG.Columns[colIndex].GetCellContent(row) is TextBlock cellContent && cellContent.Text.Equals(selection))
            {
                object item = mtoDG.Items[i];
                mtoDG.SelectedItems.Add(item);
            }
        }
    }

Я обнаружил, что этот метод работает, только если вся сетка данных отображается на экране.Если из-за нехватки места есть какие-либо строки, которые не отображаются, то это приведет к ошибке nullexception.

Так что мой вопрос: есть ли что-нибудь, что я могу изменить в своем коде, чтобы он работал, даже если на дисплее есть невидимые строкиобласть

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Хорошим решением здесь является наличие DataContext со свойством IsSelected для строк, тогда вам просто нужно связать его со строкой IsSelected, после этого вы можете просто установить свойство DataContext, и все должно быть в порядке, потому что ваш DataContext всегда имеет допустимые элементы.

0 голосов
/ 11 сентября 2018

Я думаю, вам нужно сначала выяснить, что вызвало ArgumentNullException.Отключение функции виртуализации DataGrid может помочь.

0 голосов
/ 11 сентября 2018

Во-первых, обработайте ArgumentNullException, добавив row != null:

DataGridRow row = mtoDG.ItemContainerGenerator.ContainerFromIndex(i) as DataGridRow;
if (row != null)
{
    if (mtoDG.Columns[colIndex].GetCellContent(row) is TextBlock cellContent && cellContent.Text.Equals(selection))
    {
        object item = mtoDG.Items[i];
        mtoDG.SelectedItems.Add(item);
    }
}

Во-вторых, подпишитесь на событие ItemContainerGenerator.StatusChanged, чтобы обновить HighlightSelections:

mtoDG.ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;

private void ItemContainerGenerator_StatusChanged(object sender, EventArgs e)
{
    // HighlightSelections(?, ?);
}
...