Как обновить DataGrid через определенные промежутки времени в F #? - PullRequest
0 голосов
/ 12 июля 2009

У меня есть фоновый поток, обновляющий массив. Через определенные промежутки времени я вызываю 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

Ответы [ 3 ]

1 голос
/ 12 июля 2009

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

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

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

0 голосов
/ 13 июля 2009

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

0 голосов
/ 12 июля 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())

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

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

...