Pergunta

Estou tentando descobrir isso, dado o seguinte código, o refresh () precisa ocorrer no thread da interface do usuário? Parece funcionar, e estou me perguntando se o CollectionViewSource é na verdade um objeto com reconhecimento de linha / seguro? Definitivamente, possui propriedades e métodos para apoiar a chamada no encadeamento correto, mas não tenho certeza se isso é deixado para o desenvolvedor ou se isso é realizado dentro do objeto?

public CollectionViewSource UserList { get; private set; }
    void setupCollections()
    {
        UserList = new CollectionViewSource();
        UserList.Source = searchProvider.UserResults;
        UserList.SortDescriptions.Add(new SortDescription("DisplayName", ListSortDirection.Ascending));
    }

Este tópico é seguro em Silverlight ???

void RefreshUserList()
    {
        UserList.View.Refresh();
    }

Ou você precisa fazer algo assim?

void RefreshUserList()
    {
        // Is This Required?
        UserList.Dispatcher.BeginInvoke(() =>
            {
                UserList.View.Refresh();
            });
        // Or MVVM-light Method
        DispatcherHelper.CheckBeginInvokeOnUI(() =>
            {
                UserList.View.Refresh();
            });
    }
Foi útil?

Solução

De acordo com a documentação da Microsoft sobre ColeçãoViewSource O objeto CollectionViewSource não é seguro. Parece que isso não é relatado como seguro, mesmo que pareça funcionar em muitas situações.

Isso pode ocorrer porque o método chamado está realmente na visualização, não na Coleção ViewSource. A vista retorna um ICOLLECTIONVIEW Interface - Os detalhes da classe de suporte não são conhecidos, exceto que o método Createview () cria isso.

Eu sugeriria que sempre consideramos isso não segura e a despachar para o encadeamento correto, embora meu teste da visualização.Refresh () pelo menos sugira que ele seja seguro para threads.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top