如何在F#中以定时间隔刷新DataGrid?

时间:2009-07-12 14:12:59

标签: wpf datagrid f# refresh

我有一个后台线程更新数组。在定时间隔,我调用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 个答案:

答案 0 :(得分:1)

您是否尝试过DispatcherTimer? (以下代码在C#中)

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

防止使用Thread.Sleep。

答案 1 :(得分:0)

不能在评论中使用格式,所以我的回复。

如果我写的话,计时器实际上有效:

[<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())

它刷新很好,但丢失了排序顺序。

如何维护排序顺序?我可以轻松地对arrray进行排序,但我确实希望用户自己排序。

答案 2 :(得分:0)

由于您已经在使用WPF,是否可以将该数组转换为ObservableCollection?最后我听说,DataGrids支持它。如果集合中的对象已经是DependencyObjects,那么它们的DependancyProperties应该在网格中自动更新。如果没有,您可以手动将它们重新插入集合中。