1

Я использую Caliburn.Micro для BindableCollection для отображения данных для Telerik RadGridView, и это поточно-безопасное, что означает, что я могу обновить коллекцию из потока, отличного от UI.Thread-safe CollectionViewSource

Теперь я пытаюсь отфильтровать datagrid с помощью предиката. Природа должна использовать 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 в потоке пользовательского интерфейса?

Благодарим за любые мысли или предложения.

+0

И почему вы не хотите, чтобы звонки маршала? То, что делают люди, когда они изменяют пользовательский интерфейс. –

+0

Нам не нужно, пока это отфильтрованное представление не вступит в игру, и поэтому это не в первую очередь. Также мы хотим преодолеть некоторые издержки при выполнении модульного тестирования - не нужно беспокоиться о предоставлении контекста синхронизации и сортировки. –

+0

Вы должны маршировать вызовы так или иначе, когда работаете с UI из другого потока. Нет обходного афайка. Вы можете скрыть маршалинг внутри реализации некоторого «потокобезопасного» вида коллекции, но его все еще есть. Что касается того, что у рамки, которую вы используете, есть такой класс, я думаю, вам лучше спросить об этом на своих форумах –

ответ

0

Вам необходимо мобилизовать вызовы к потоку пользовательского интерфейса. Caliburn.Micro предоставляет Execute.OnUiThread в Caliburn.Micro для сортировки вызовов в потоке пользовательского интерфейса.