Как обновить DataGrid через определенные промежутки времени в F#?

У меня есть фоновый поток, обновляющий массив. Через определенные промежутки времени я вызываю myDataGrid.Items.Refresh(). Однако на экране ничего не меняется. Но когда я, например, нажимаю на заголовок столбца сетки данных на экране, информация актуализируется немедленно.

Мне нравится видеть изменения на экране через определенные промежутки времени, например, каждые 2 секунды. Что мне не хватает?

Вот фрагмент кода на F#, иллюстрирующий ситуацию:

...

let win = new Window()
let grid = DataGrid()
grid.HeadersVisibility <- DataGridHeadersVisibility.All
grid.ItemsSource <- myArray
win.Content <- new ScrollViewer(Content=grid)
win.Show()
...
// Background thread A
//  updating myArray

... 

// Background thread B
let updateDataGrid = 
  grid.Items.Refresh()
  Thread.Sleep(5000)
  updateDataGrid

...

[<STAThread>]
do 
  let app = new Application()
  app.Run() |> ignore

person Community    schedule 12.07.2009    source источник


Ответы (3)


Вы пробовали DispatcherTimer? (код ниже на С#)

timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1);
timer.Tick += timer1_Tick;

Предотвратите использование Thread.Sleep.

person Zyphrax    schedule 12.07.2009
comment
Добавление ‹pre› let timer = new DispatcherTimer(); timer.Interval - TimeSpan.FromSeconds(1.); timer.Tick.Add (fun _ - grid.Items.Refresh()) timer.Start() ‹/pre› выполняет свою работу! Спасибо! - person ; 12.07.2009

Не могу использовать форматирование в комментариях, поэтому вот мой ответ.

Таймер действительно работает, если я напишу:

[<STAThread>]
do 
  let app = new Application()
  let timer = new DispatcherTimer()
  timer.Interval <- TimeSpan.FromSeconds(2.)
  timer.Tick.Add (fun _ -> grid.Items.Refresh())
  timer.Start()
  app.Run() |> ignore

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

Однако, если я выполняю этот трюк:

  timer.Tick.Add (fun _ ->
                    grid.ItemsSource <- null
                    grid.ItemsSource <- myArray
                    grid.Items.Refresh())

он отлично обновляется, но теряет порядок сортировки.

Как сохранить порядок сортировки? Я могу легко сортировать массив, но мне нравится, когда пользователь также сортирует сам.

person Community    schedule 12.07.2009

Поскольку вы уже используете WPF, можно ли превратить этот массив в ObservableCollection? Последнее, что я слышал, это поддерживает DataGrids. Если объекты в коллекции уже являются DependencyObjects, то их DependancyProperties должны автоматически обновляться в сетке. Если нет, вы можете повторно вставить их в коллекцию вручную.

person YotaXP    schedule 13.07.2009
comment
Скорость обновления массива очень высока, мне действительно нужно синхронизированное обновление данных. - person ; 13.07.2009