基于之前的答案,如this和this,我知道标量属性可以从工作线程更新,而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线程更新标量属性是犹太教的。是什么给了什么?