WPF - Datagrid选择随后台工作者而改变

时间:2014-10-29 16:06:01

标签: wpf datagrid backgroundworker

我正在编写一个程序,通过串口从设备读取信息。我有一个数据网格中可用设备的列表。当用户单击某一行时,它会从设备中提取信息并将其显示在单独的列表中。设备响应和填充信息通常需要大约一秒钟。但是,在此秒期间,数据网格行不会突出显示为已选中。因此,从鼠标点击数据网格行开始,它实际显示为突出显示/已选择时需要大约一秒钟。

我认为后台工作线程最适合用于此,但我使用下面的代码得到了相同的结果。我是否错误地使用它,或者我还应该做些什么来选择数据网格行?

private void relayList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += GetLinks;
    worker.RunWorkerAsync();
}

 private void GetLinks(object sender, DoWorkEventArgs e)
 {
    //send message to viewModel and do time-consuming work here
}

1 个答案:

答案 0 :(得分:0)

BackgroundWorker具有RunWorkerCompleted方法。它将在UI线程的执行上下文中运行。

还有一个result属性用于将结果传递给下一个方法,即RunWorkerCompleted方法。

private void yourMethod()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += DoWorkMethod;
    worker.RunWorkerCompleted += RunWorkerCompletedMethod;
    worker.RunWorkerAsync();
}

private void RunWorkerCompletedMethod(object sender, RunWorkerCompletedEventArgs e)
{
    string result = (string)e.Result;

    // do stuff here
}

private void DoWorkMethod(object sender, DoWorkEventArgs e)
{
    e.Result = string.Empty; // Your device data
}

如果你绝望地想要不使用已完成的方法。不要使用调度程序,而是使用SynchronizationContext。

首次运行表单时,您需要在字段上存储SynchronizationContext.Current,但之后您可以在UI线程上调用所需的任何内容。