Пользовательская сортировка WPF DataGrid: изменение порядка элементов в ItemsSource

У меня есть собственная сетка, которая наследуется от DataGrid (из WPFToolkit) и содержит около 10000 элементов. Встроенная сортировка очень медленная. Таким образом, я написал отдельный класс, который поддерживает сортировку всех DataRowView элементов для каждого столбца (это работает, потому что добавления и удаления из сетки крайне редки, если вообще).

Сетка имеет AutoGenerateColumns='True' и привязана к DefaultView из DataTable.

Я переопределяю OnSorting, чтобы знать, когда щелкают заголовок столбца, и пытаюсь заменить ItemsSource сетки моим отсортированным списком DataRowView. Ниже приведен метод:

    private void RefreshItems()
    {
        if (_updating || _multiIndexer.Count == 0)
            return;

        try
        {
            _updating = true;
            this.AutoGenerateColumns = false;

            // replace the itemssource with my maintained and sorted list of 
            // DataRowView items
            this.ItemsSource = _multiIndexer.ToList();
        }
        finally
        {
            //this.AutoGenerateColumns = true;
            _updating = false;
        }
    }

Проблема в том, что я уничтожаю столбцы, существовавшие от автогенерации. Кроме того, у меня остались только столбцы, соответствующие свойствам из DataRowView.

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

Любые идеи, как передать новый список строк в ItemsSource или Items, не разрушая автоматически сгенерированные столбцы? Создание всех моих столбцов вручную не вариант.

Привет, Шон


person sean.net    schedule 20.04.2012    source источник


Ответы (2)


Я не знаю, как избавиться от повторного создания столбцов. У меня похожая проблема, и обычно я использую ICollectionView и DeferRefresh. Потому что вам не нужно делать это в вашем реальном объекте модели. Но я не уверен, работает ли он с DataViews так же хорошо, как со списком.

person Martin Moser    schedule 20.04.2012

что вы подразумеваете под "это очень медленно"?

если я возьму сетку данных и привяжу к ней таблицу данных с 50000 строк и 20 столбцов. мне кажется быстро

модель просмотра

public class Viewmodel
{
    public DataTable MyData { get; set; }

    public Viewmodel()
    {
        this.MyData = new DataTable();

        for (int i = 0; i < 20; i++)
        {
            this.MyData.Columns.Add("Col" + i);
        }

        for (int i = 0; i < 50000; i++)
        {
            var row = MyData.NewRow();
            for (int j = 0; j < 20; j++)
            {

                row["Col" + j] = string.Format("{0} Row, Col {1}", i, j);
            }
            this.MyData.Rows.Add(row);

        }
    }
}   

окно

    <DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="True">

    </DataGrid>

редактировать: это .net4.0

person blindmeis    schedule 20.04.2012
comment
как только мы начинаем сортировать по нескольким столбцам в обоих направлениях, встроенная сортировка становится очень медленной. выбранный нами алгоритм в 4-10 раз быстрее создает отсортированный список строк данных для отображения (по сравнению со временем, затрачиваемым сеткой на выполнение собственной сортировки, но без отображения этого списка... так что я все еще не уверены, что результаты верны). вот почему мне нужно отобразить список имеющихся у меня строк данных, не уничтожая и не перестраивая столбцы. - person sean.net; 20.04.2012