线程安全的CollectionViewSource

时间:2013-06-27 10:34:43

标签: c# multithreading observablecollection caliburn.micro collectionviewsource

我一直在使用Caliburn.Micro的BindableCollection为Telerik RadGridView渲染数据,它的线程安全,这意味着我可以从非UI线程更新集合。

现在我要做的是使用谓词过滤数据网格。自然的想法是使用CollectionViewSource,以便我的基础数据不会改变,我可以通过在其上应用谓词来控制CollectionViewSource的视图。问题是CollectionViewSource不是线程安全的,如果源从非UI线程更新,则抛出。

下面是XAML和视图模型。

XAML:

        <controls:RadGridView Grid.Column="2"
                          AutoGenerateColumns="False"
                          behaviours:RadGridViewExtensions.RowDoubleClick="OpenProgram"
                          CanUserDeleteRows="False"
                          CanUserInsertRows="False"
                          DataContext="{Binding ContractHeadersCollectionView}"
                          IsReadOnly="True"
                          ItemsSource="{Binding}"
                          RowIndicatorVisibility="Collapsed"
                          SelectedItem="{Binding SelectedContractHeader}"
                          SelectionMode="Single"/>

查看型号:

    /// <summary>
    /// Initialises a new instance of the <see cref="PortfolioViewModel"/> class.
    /// </summary>
    public PortfolioViewModel()
    {
        this.ContractHeaders = new BindableCollection<ContractHeaderViewModel>();
        this.ContractHeadersCollectionView = new CollectionViewSource() { Source = ContractHeaders };
    }

    public CollectionViewSource ContractHeadersCollectionView { get; private set; }

问题是:

  1. Calibun.Micro是否提供了一个线程安全的CollectionViewSource等价物?
  2. 如果没有,如果我不想编组将BindableCollection更新为UI线程的调用,该选项是什么?
  3. 感谢您的任何想法或建议。

1 个答案:

答案 0 :(得分:0)

您需要封送对UI线程的调用。 Caliburn.Micro在Caliburn.Micro中提供Execute.OnUiThread,用于编组对UI线程的调用。