我有一个后台线程更新数组。在定时间隔,我调用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
答案 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应该在网格中自动更新。如果没有,您可以手动将它们重新插入集合中。