Domanda

Questa non è una domanda, ma la mia risposta a un problema a cui non sono riuscito a trovare una soluzione su Internet.

Ho avuto un problema a cancellare il testo di ricerca in un'applicazione MVVM Silverlight. Potrei cancellare il selezione e il testo selezionato ma il testo di ricerca è stato lasciato indietro. È solo a lettura e non può essere modificato per vincolo.

Esempio: boxbox automatico con un elenco di paesi. Quando l'utente desidera inserire l'Australia, inserisce "AU" a questo punto l'elenco appriude con l'Austria e l'Australia. L'utente può quindi selezionare l'Australia e andare avanti. Alla fine della modifica fanno clic su un pulsante "Salva". A questo punto è probabile che si desidera cancellare i dati per inserire nuovi dati.

Anche se si dispone di legami con le proprietà selezionate e di testo e le imposti su "NULL" e String.empty rispettivamente la proprietà SearchText rimane e la boxbox automatica non verrà cancellata ma conterrà "Au".

È stato utile?

Soluzione

Ho pubblicato su questo su Internet, ma non ho potuto ottenere alcuna risposta sul controllo stesso e così ci sono arrivato da un angolo diverso che può aiutare qualcuno che finisce frustrato come me.

Sto usando un'applicazione Modello di navigazione Silverlight che utilizza un frame di navigazione in cui caricare le pagine Silverlight. Ho notato che se ho navigato in un'altra pagina e sono tornato ai miei dati, il testo di ricerca è stato cancellato. Eventuali valori legati alle proprietà sono rimasti validi, solo il testo di ricerca era stato cancellato su tutti i caselle di completamento automatico. Ho quindi usato il metodo del pageconduttore di iniettare il frame di navigazione nel ViewModel in cui potrei chiamare il metodo di aggiornamento. Ho ottenuto questo metodo da John Papa esempio Dall'evento Silverlight Firestarter, ho semplicemente aggiunto un metodo di aggiornamento all'interfaccia iPageConductor in modo da essere in grado di chiamare "pageconductor.refresh ()" che è come ricaricare la pagina. Spero che questo aiuti qualcuno là fuori.

Altri suggerimenti

var t = ProductCombo.ItemsSource;
ProductCombo.ItemsSource = null;
ProductCombo.Text = string.Empty;
ProductCombo.SelectedValue = null;
//ProductCombo.Text = string.Empty;
ProductCombo.ItemsSource = t;

Prova questo per favore, ha funzionato per me

È necessario cancellare la proprietà vincolata al testo all'interno di set parte della proprietà vincolata selezionata, in questo modo:

    public string AnalisisText
    {
        get { return _analisisText; }

        set
        {
            if (_analisisText == value)
            {
                return;
            }

            _analisisText = value;

            RaisePropertyChanged(AnalisisTextPropertyName);
        }
    }

    public DatosAutoCompletaPedidosDetalleViewDTO AnalisisSelect
    {
        get { return _analisisSelect; }

        set
        {
            if (_analisisSelect == value)
            {
                return;
            }


            _analisisSelect = value;

            if (_analisisSelect == null) AnalisisText = "";

            RaisePropertyChanged(AnalisisSelectPropertyName);
        }
    }

Quindi, quando si imposta NULL su proprietà selectedItem, l'altra proprietà imposterà su "".

Il modo più semplice che ho trovato è estendere il completamento automatico:

public class AutoCompleteBoxClear : AutoCompleteBox
{
    public AutoCompleteBoxClear()
    {
        DataContextChanged += (o, e) =>
        {                
            if (SelectedItem == null)
                Text = string.Empty;
        };
    }
}

Ora usa il tuo nuovo controllo automatico di boxexclear nel tuo XAML.

Questo cancella il testo solo quando AutoCompleteBox DataContext si cambia in NULL (cioè l'utente fa clic su DataForm.)

Nota: penso che DataContextChanged sia disponibile solo in Silverlight 5, ma immagino che chiunque usa ancora Silverlight in questi giorni avrebbe probabilmente aggiornato ormai ...

var t = ProductCombo.ItemSsource; ProductCombo.ItemSSource = null; ProductCombo.Text = String.Empty; ProductCombo.SelectedValue = null; //ProductCombo.text = string.empty; ProductCombo.ItemSsource = T;

Infrollata, questo è in codice e avevo bisogno di una soluzione MVVM.

Di recente ho avuto lo stesso problema con la mia app WPF. Ho scoperto che la soluzione non è quella di impostare l'oggetto associato a SelectedItem su NULL, ma al suo valore predefinito. Mi ci è voluto un po 'per capirlo. Quindi nel tuo esempio, non lo sarebbe SelectedCountry = null, ma SelectedCountry = new SelectedCountry(). In questo caso anche il testo di ricerca viene cancellato. Controlla il mio post SO riguardo a questa questione: AutoCompleteBox non cancella i colpi della tastiera.

Sicuramente la proprietà SearchText è di sola lettura, ma possiamo ottenere il componente figlio di AutoCompleteBox:

var searchText = autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text");

E ora possiamo reimpostare SearchText tramite proprietà di testo del componente di testo:

if (searchText != null) searchText.Text = string.Empty;

In C# 6.0 è più laconicamente:

autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text")?.Text = string.Empty;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top