"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como modificar um ObservableCollection de um thread não-Dispatcher no WPF?

Como modificar um ObservableCollection de um thread não-Dispatcher no WPF?

Publicado em 2024-11-08
Navegar:291

How to Modify an ObservableCollection From a Non-Dispatcher Thread in WPF?

"Este tipo de CollectionView não suporta alterações em sua SourceCollection de um thread diferente do thread do Dispatcher"

Descrição do problema

Um DataGrid vinculado para um ObservableCollection preenchido de forma assíncrona gera um erro informando que alterações no SourceCollection não são permitidas de um não-Dispatcher thread.

Solução

O problema surge da afinidade do thread. O ObservableCollection é criado inicialmente no thread de UI, tornando-o acessível apenas a partir do thread de UI. Para modificá-lo a partir de um thread diferente, o delegado deve ser colocado no UI Dispatcher.

Código ViewModel atualizado

public void Load()
{
    matchList = new List();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

Ao invocar o delegado no UI Dispatcher, as adições ao ObservableCollection são agendadas no thread da UI, resolvendo a exceção.

Enhanced Binding and Refresh

Para assíncrono vinculação e atualização do DataGrid, considere usar INotifyPropertyChanged nas propriedades do ViewModel e invocar o Dispatcher para atualizar a UI elementos.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3