WPF ICollectionView Обновить - PullRequest
       17

WPF ICollectionView Обновить

1 голос
/ 05 августа 2009

Есть ли способ, как это сделать

ICollectionView.Refresh() 

или

CollectionViewSource.GetDefaultView(args.NewValue).Refresh();

в отдельной теме ?

Я знаю, что могу использовать диспетчер, но эта коллекция привязана к ListView, и она генерирует исключения между потоками.

Причина, по которой мне нужен второй поток, заключается в том, что у меня есть Control, который отображает список IMyItems. При фильтрации этой коллекции (по вводу пользовательских текстовых изменений) я хочу, чтобы моя анимация отображалась при изменении CollectionView.

Ответы [ 3 ]

3 голосов
/ 05 августа 2009

Как насчет использования Dispatcher для работы с фоновым приоритетом?

Dispatcher.Invoke(DispatcherPriority.Background,
    () => { CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); }
);
3 голосов
/ 06 августа 2009

Вы не можете!

Все операции пользовательского интерфейса должны выполняться в потоке пользовательского интерфейса, и почти каждый вызов внутри DispatcherObject WPF (и всех элементов управления в этой иерархии) будет регулярно вызывать CheckAccess ().

Возможно, вы захотите использовать ObservableCollection, чтобы поддерживать свои данные в актуальном состоянии, если вы выполняете обработку в фоновом потоке или BackgroundWorker.

0 голосов
/ 05 августа 2009

Я взломал быстрый метод для вызова действий над объектами, отсылаемыми по wpf (все элементы управления wpf наследуются от DispatcherObject )

public static void InvokeWpf(DispatcherObject dispatchable, Action action, bool async)
{
    // DispatcherOperationCallback is optimized for wpf invoke calls
    DispatcherOperationCallback toDo = delegate{ action(); return null; };

    if (!dispatchable.CheckAccess())
    {
        if (async) 
            dispatchable.Dispatcher.BeginInvoke(toDo, null);
        else
            dispatchable.Dispatcher.Invoke(toDo, null);
    }
    else
    {
        toDo(null);
    }
}

Использование:

InvokeWpf(listView, 
       () => CollectionViewSource.GetDefaultView(listView).Refresh(), 
       false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...