【发布时间】:2019-08-19 16:02:22
【问题描述】:
我在 ViewModel 中定义了一个 BlockingCollection,它由不同的线程更新。我正在使用这个 BlockingCollection 来填充 ListView。但是这个集合中新添加的项目并没有反映在 UI 上。我需要一个 BlockingCollection,因为我正在进行一个多线程操作,这个集合可能由不同的线程更新,我想确保线程安全,因此决定使用 BlockingCollection
我的 ViewModel 是:
public BlockingCollection<WorklistItem> ListSource { get; set; }
在 xaml 中,我将此 BlockingCollection 设置为将列表视图填充为
<ListView x:Name="MyList" HorizontalAlignment="Left" Height="263" Margin="5,200,0,0" VerticalAlignment="Top" Width="515" Grid.Column="0" AutomationProperties.IsColumnHeader="True"
SelectedItem="{Binding SelectedItem}"
ItemsSource ="{Binding ListSource}" >
【问题讨论】:
-
如果没有好的minimal reproducible example,就不可能提供好的答案。也就是说,
BlockingCollection<T>没有实现INotifyCollectionChanged,这是为了更新集合导致绑定的 UI 更新所必需的。恕我直言,您应该只使用ObservableCollection<T>并明确管理线程安全。 Stack Overflow 上已经有很多问题解释了如何从后台线程更新ObservableCollection<T>。
标签: c# wpf multithreading data-binding blockingcollection