如何将 BlockingCollection 绑定到 WPF 列表视图

How to bind a BlockingCollection to a WPF Listivew

我在我的 ViewModel 中定义了一个 BlockingCollection,它由不同的线程更新。我正在使用此 BlockingCollection 来填充 ListView。但是此集合中新添加的项目未反映在 UI 上。我需要一个 BlockingCollection,因为我正在进行一个多线程操作,这个 Collection 可能由不同的线程更新,我想确保线程安全,因此决定使用 BlockingCollection

我的视图模型是:

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}" >

最简单的方法是从一个 observablecollection 开始,然后添加锁定和同步。 Using BindingOperations.EnableCollectionSynchronization

如果您相反特别需要阻塞集合中的功能,那么您可以继承 observablecollection,实现 iproducerconsumercollection https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.iproducerconsumercollection-1?view=netframework-4.8 then use your new collection as the base type of your blockingcollection. When you new up a blockingcollection you can give it an underlying collection type other than the default. If you're not aware you can do that follow this link and scroll down https://docs.microsoft.com/en-us/dotnet/standard/collections/thread-safe/blockingcollection-overview