1

我一直在使用 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 线程,有什么选择?

感谢您的任何想法或建议。

4

1 回答 1

0

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

于 2013-07-03T10:35:20.577 回答