.Hi,我在使用wpf和线程方面遇到了一些问题,我只是不能在这里讨论什么是幸福的。
我有这个事件func
private void TaskActiveChangeClicked(object sender, RoutedEventArgs e)
{
//Do things...
this.ChangeTask((sqTask)this.SelectionObject, (sqTask)this.SelectionObject);
this.FindSelectionObject();
}
ChangeTask
private void ChangeTask(sqTask Old, sqTask New)
{
//Do things (update in mongoDB)...
this.LoadTaskList();
}
LoadTaskList [TaskListTable
是一个DataGrid]
private void LoadTaskList()
{
//Do things (query mongoDB and get List<sqTask>)...
this.Dispatcher.Invoke((Action)(() =>
{
TaskListTable.Items.Clear();
foreach (sqTask task in TaskList)
{
TaskListTable.Items.Add(db);
}
}
));
}
现在奇怪的部分......
SelectedIndex
绑定到TaskListTable
DataGrid(SelectedIndex="{Binding SelectedIndex}"
)
当我像这样运行FindSelectionObject()时:
private void FindSelectionObject()
{
this.SelectedIndex = TaskListTable.Items.IndexOf(((sqTask)SelectionObject));
MessageBox.Show("");
DataGridRow row = TaskListTable.ItemContainerGenerator.ContainerFromItem(TaskListTable.Items[SelectedIndex]) as DataGridRow;
row.Background = Brushes.LightGoldenrodYellow
}
它完美无缺,但如果我删除MessageBox
崩溃,那么row
不包含实例
我猜LoadTaskList
将项目添加到DataGrid,但是在调用结束之前它不会更新。
因此,...ContainerFromItem(TaskListTable.Items[SelectedIndex]) as DataGridRow;
是空的。
但是当我使用messageBox时,它会在搜索表格中的行之前做一些“Tick”。
问题: 我对吗?我该如何解决? (顺便说一句,如果你可以添加到theads的答案推荐指南使用我会很高兴)
谢谢!
答案 0 :(得分:1)
这是因为当您显示该框时,TaskListTable
会添加所有项目。如果你把一个假的Thread.Sleep
放在那里,那就行了。