locked
Impostare la proprietà ItemsSource MapItemsControl RRS feed

  • Domanda

  • La mia applicazione fa (o almeno dovrebbe fare) questo:

    ho una mappa e un'AutoCompleteBox. Appena il testo cambia, ed è più lungo di (poniamo) 4 caratteri, vado a filtrare una lista di oggetti in questo modo:

    if (tboxComune.Text.Length > 4)
                {
                    ObservableCollection<DependencyObject> children = MapExtensions.GetChildren(mappa);
                    var obj = children.FirstOrDefault(x => x.GetType() == typeof(MapItemsControl)) as MapItemsControl;
                    if (obj != null)
                    {
                        var lista = from element in App.HotSpotList
                                    where element.Comune.ToUpper() == tboxComune.Text.ToUpper()
                                    select element;
                        obj.ItemsSource = lista.ToList();
                    }
                }

    Devo farlo, perché gli elementi nella lista di partenza sono molti, troppi, e mi vanno a rallentare l'app. Il problema è che quando provo ad impostare ItemsSource mi viene sollevata una InvalidOperationException:

    Items must be empty before using Items Source

    Se provo a chiamare Clear() prima di impostare la nuova ItemsSource invece mi viene risposto sempre con una InvalidOperationException, ma il messaggio stavolta è

    Collection is in non writeable mode

    Non so proprio come risolvere. Per la mia app è fondamentale poter cambiare di volta in volta gli elementi visualizzati sulla mappa.

    Tra l'altro il metodo TextChanged della AutoCompleteBox viene invocato più volte del previsto. Mi spiego meglio:

    • io scrivo a
    • Viene invocato, ma la if non fa proseguire oltre
    • seleziono uno degli elementi della lista
    • Viene invocato altre due volte

    A cosa può essere dovuto questo comportamento? Non c'è nessun altro nella lista di invocazione del delegate.


    -- Pierpaolo Paris

    sabato 9 novembre 2013 23:01

Risposte

  • Ho risolto da me. Il modo giusto di procedere era scrivere il metodo associato all'evento Loaded di Page (così siamo sicuro che tutto è stato inizializzato), e all'interno di questo metodo associare alla ItemsSource di MapItemsControl una Observable Collection, dopodiché si va a lavorare unicamente sulla collezione.

    -- Pierpaolo Paris

    • Contrassegnato come risposta Pierpaolo Paris mercoledì 13 novembre 2013 20:57
    mercoledì 13 novembre 2013 20:53