Замедленная скорость обновления привязанной DataGrid - PullRequest
3 голосов
/ 15 декабря 2010

В моем приложении WPF / C # есть DataGrid, связанный с коллекцией Entity Framework. Каждая строка имеет связанные столбцы, которые меняются очень часто - много раз в секунду. Это приводит к тому, что столбец становится в основном нечитаемым, потому что он меняется так часто. Как заставить WPF показывать новое значение только каждые 0,5 секунды или 1 секунду, даже если значение меняется каждые 0,1 секунды?

, например

dataGrid.MaxRefreshRate = 1000; (value in milliseconds).

Ответы [ 3 ]

2 голосов
/ 30 декабря 2010

Я думаю, вам нужно создать слой между вашими данными и сеткой данных.

Предположим, что ваши данные относятся к типу List и в данный момент они привязаны к вашей DataGrid.

Нам понадобится некоторый класс-оболочка для ваших данных (для одной строки в данном случае).Эта обертка deffers свойство изменилось и запускает его регулярно.Обратите внимание: я написал этот код наизусть без какого-либо тестирования, могут быть (и будут) ошибки.Он также не является поточно-ориентированным, вам нужно добавить некоторые блокировки при работе со списком.Но точка должна быть достигнута.

public class LazyRecord : INotifyPropertyChanged
{
  private string name;
  public string Name
  {
    get { return name; }
    set
    {
      if (name != value)
      {
         name = value;
         OnPropertyChanged("Name");
      }
    }

    // other properties

    // now the important stuff - deffering the update
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
       if (this.changedProperties.Find(propertyName) == null)
        this.changedProperties.Add(propertyName);
    }

    private readonly List<string> changedProperties = new List<string>();

    // and the timer that refreshes the data
    private readonly Timer timer;
    private readonly Record record;

    public LazyRecord(Record record)
    {
       this.timer = new Timer(1000, OnTimer);
       this.record = record;

       this.record.OnPropertyChanged += (o, a) => this.OnPropertyChanged(a.PropertyName);
    }

    public void OnTimer(..some unused args...)
    {
       if (this.PropertyChanged != null)
       {
        foreach(string propNAme in changedProperties)
        {
           PropertyChanged(new PropertyChangedEventArgs(propName));
        }
    }
}

После этого просто создайте List из вашего List и используйте его в качестве источника данных.Очевидно, что просто использовать универсальное решение, которое гораздо более пригодно для повторного использования.Надеюсь, я немного помог.

1 голос
/ 25 декабря 2010

Просто идея, как это могло бы работать.

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

Может быть, вы найдете больше и лучшие ответы на похожий новый вопрос как-в-ду-обработки, и продолжай-гуй-обновилась-используя-* 1010 привязки *

0 голосов
/ 15 декабря 2010

Попробуйте listView.Items.Refresh();.

...