Я использую 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; }
Вопросов:
- ли Calibun.Micro обеспечивают поточно-CollectionViewSource эквивалент?
- Если нет, то какой вариант, если я не хочу, чтобы маршал вызывал обновление BindableCollection в потоке пользовательского интерфейса?
Благодарим за любые мысли или предложения.
И почему вы не хотите, чтобы звонки маршала? То, что делают люди, когда они изменяют пользовательский интерфейс. –
Нам не нужно, пока это отфильтрованное представление не вступит в игру, и поэтому это не в первую очередь. Также мы хотим преодолеть некоторые издержки при выполнении модульного тестирования - не нужно беспокоиться о предоставлении контекста синхронизации и сортировки. –
Вы должны маршировать вызовы так или иначе, когда работаете с UI из другого потока. Нет обходного афайка. Вы можете скрыть маршалинг внутри реализации некоторого «потокобезопасного» вида коллекции, но его все еще есть. Что касается того, что у рамки, которую вы используете, есть такой класс, я думаю, вам лучше спросить об этом на своих форумах –