WPF ObservableCollection未更新?
似乎无法获取要更新的ObservableCollection。树视图显示为空。 错误:此类型的collectionview不支持从与dispatcher线程不同的线程更改其sourcecollection 类级变量WPF ObservableCollection未更新?,wpf,multithreading,observablecollection,Wpf,Multithreading,Observablecollection,似乎无法获取要更新的ObservableCollection。树视图显示为空。 错误:此类型的collectionview不支持从与dispatcher线程不同的线程更改其sourcecollection 类级变量 public ObservableCollection<TSItem> tsItems { get; set; } xaml 您应该将更改发送到UI线程: private void AddTreeViewItem(TSItem item) { Dispatc
public ObservableCollection<TSItem> tsItems { get; set; }
xaml
您应该将更改发送到UI线程:
private void AddTreeViewItem(TSItem item)
{
Dispatcher.BeginInvoke(new Action(() => tsItems.Add(item)));
}
您应该将更改分派到UI线程:
private void AddTreeViewItem(TSItem item)
{
Dispatcher.BeginInvoke(new Action(() => tsItems.Add(item)));
}
@有些是正确的。我还要补充一点,您说您正在通过后台工作程序更新可观察的集合。如果要执行此操作,则需要确保执行此操作时返回到UI线程。@Somedust是正确的。我还要补充一点,您说您正在通过后台工作程序更新可观察的集合。如果要执行此操作,则需要确保执行此操作时返回UI线程。在更新可观察集合之前,必须重新调用UI线程
作为使其正常工作的捷径,请考虑<代码>应用程序>分派器>调用< <代码> >或>代码>开始调用> /COD>。这需要引用
如果你想以这样或那样的方式变得更纯洁,你需要做更多的工作。其中大部分涉及捕获UI线程的SynchronizationContext
- 创建自己的INotifyCollectionChanged实现,该实现封装了一个
,并转发了一个内部SynchronizationContext
observeCollection
- 使用
获取构造函数中的SynchronizationContext.Current
。只有在UI线程上访问构造函数时,这才有效SynchronizationContext
- 将
传递给每个需要同步上下文的类SynchronizationContext
作为使其正常工作的捷径,请考虑<代码>应用程序>分派器>调用< <代码> >或>代码>开始调用> /COD>。这需要引用
如果你想以这样或那样的方式变得更纯洁,你需要做更多的工作。其中大部分涉及捕获UI线程的SynchronizationContext
- 创建自己的INotifyCollectionChanged实现,该实现封装了一个
,并转发了一个内部SynchronizationContext
observeCollection
- 使用
获取构造函数中的SynchronizationContext.Current
。只有在UI线程上访问构造函数时,这才有效SynchronizationContext
- 将
传递给每个需要同步上下文的类SynchronizationContext
<TreeView x:Name="tvTest" HorizontalAlignment="Left" Height="249" Margin="140,36,0,0" VerticalAlignment="Top" Width="257">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Icon}" />
<TextBlock Text="{Binding Header}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
private void AddTreeViewItem(TSItem item)
{
Dispatcher.BeginInvoke(new Action(() => tsItems.Add(item)));
}