none
Переход с DataGrid на Grid в WPF RRS feed

  • Вопрос

  • Я работаю с биржевыми данными и в моменты ускорения потока данных DataGrid подвисает. Хочу перейти на Grid и интересует объем работы при этом переходе. Прежде всего возможна ли привязка Grid к ObservableCollection так же удобно как в DataGrid?

    Eugene

    12 августа 2013 г. 16:53

Ответы

  • Grid не предназначен для подобных вещей, это панель с возможностью размещать контролы как в таблице.

    DataGrid вполне можно использовать и для больших объемов данных. Для этого нужно сделать коллекцию, которая будет не заменяться полностью, а менять только значения в ячейках. Получится следующее - у вас есть коллекция, прилетающая с сервера. Вы вместо того, чтобы заменять полностью коллекцию, замапленную на DataGrid, заменяете в этой коллекции значения на новые (заменять обязательно нужно только значения в свойствах, а не добавлять/удалять строки). Работать будет очень быстро и без особых проблем. Тем более, что вам же не нужно редактирование?


    13 августа 2013 г. 12:26
    Отвечающий

Все ответы

  • Grid не предназначен для подобных вещей, это панель с возможностью размещать контролы как в таблице.

    DataGrid вполне можно использовать и для больших объемов данных. Для этого нужно сделать коллекцию, которая будет не заменяться полностью, а менять только значения в ячейках. Получится следующее - у вас есть коллекция, прилетающая с сервера. Вы вместо того, чтобы заменять полностью коллекцию, замапленную на DataGrid, заменяете в этой коллекции значения на новые (заменять обязательно нужно только значения в свойствах, а не добавлять/удалять строки). Работать будет очень быстро и без особых проблем. Тем более, что вам же не нужно редактирование?


    13 августа 2013 г. 12:26
    Отвечающий
  • У меня коллекции Observable Collection обновляются и они связаны с DataGrid.

    // DataBinding   
    public ObservableCollection<LineDom> LinesDom { get; set; }

    Есть еще центровка :

     ProfilDivScroll = (ScrollViewer)dgProfileDiv.Template.FindName("DG_ScrollViewer", dgProfileDiv);
                                if (ProfilDivScroll != null)
                                ProfilDivScroll.ScrollToVerticalOffset((double)(Model.CurrentPriceIndexDiv - (int)(dgProfileDiv.ActualHeight / 40)));И эти


    И по коллекциям нахожу нужные ячейки и редактирую. В одной коллекции может быть 600 строк и 10-20 столбцов.

    Мне не нужно, чтобы были видимы все строки, я знаю дипазон видимости, который меня интересует. Как это можно использовать?

    Edit меня действительно не интересует.Иногда думал создать маленькую коллекцию и ее забиндить, а ее значения динамически привязывать к большой с учетом центровки.Но хотелось бы попроще и эффективнее.

    Еще есть:

      this.dgProfileDiv.Items.Refresh();

    Как можно оптимизировать ресурсы?


    Eugene





    13 августа 2013 г. 13:59
  • Всё что невидимо - не создается. В этом плане можно не беспокоиться за производительность. Проблема возникает с отрисовкой тогда, когда нужно весь грид полностью перерисовать. Например, вызов метода Refresh заставит грид заново рисовать сначала колонки, а потом строки. Вам нужно этого избежать. Если у вас постоянное количество строк и столбцов (для одного грида), то проблем не должно быть - один раз создаете коллекцию-клона, а потом уже её ячейки обновляете. Можно воспользоваться DataTable классом для этого, у него есть метод для мёрджа данных.

    На счет скрола не подскажу - слишком мало информации.

    19 августа 2013 г. 10:01
    Отвечающий