从后台线程更新绑定属性不能按预期工作?

时间:2016-04-18 21:09:01

标签: c# wpf multithreading xaml mvvm

基于之前的答案,如thisthis,我知道标量属性可以从工作线程更新,而propertychanged事件将被封送到UI线程。我还知道必须使用.NET 4.5中引入的绑定同步手动编组或修改集合。直到今天下午才真正给我带来问题。请考虑以下代码段:

private void OnDevicesUpdated(object sender, EventArgs args)
{
    SelectedVehicleGroupInfos?.ForEach(g =>
    {
        var selectedDevice = g.SelectedDeviceSummary;

        g.DeviceSummaries = new ObservableCollectionEx<DeviceSummary>(SelectedVehicle.ResolveSupportedDevices());

        if (selectedDevice != null)
        {
            ////g.SelectedDeviceSummary = g.DeviceSummaries.FirstOrDefault(d => d.Id.Equals(selectedDevice.Id));
            Application.Current.Dispatcher.BeginInvoke(new Action(() => 
                g.SelectedDeviceSummary = g.DeviceSummaries.FirstOrDefault(d => d.Id.Equals(selectedDevice.Id))));
        }
    });
}

对于上下文,我有一个&#34; Groups&#34;的列表框。在视图上,项目模板也是一个列表框(&#34; DeviceSummary&#34;对象)。上面的方法是Timer的已用处理程序,因此在后台线程上执行。

由于我完全替换了每个组的绑定设备集合,因此我需要存储当前选定的设备并在构建新列表后重新选择。问题是if语句中的行。设备列表框的SelectedItem属性绑定到g.SelectedDeviceSummary,当我尝试从后台线程设置该属性时(请参阅注释掉的行),UI无法重新选择适当的设备。没有例外。什么都没有。

然而,当我手动编组绑定属性的设置时,一切正常并且我的思维被颠倒了,因为我虽然从非ui线程更新标量属性是犹太教的。是什么给了什么?

0 个答案:

没有答案