Question

Ce n'est pas une question mais ma réponse à un problème auquel je n'ai pas trouvé de solution sur Internet.

J'ai rencontré un problème pour effacer le SearchText dans une application MVVM Silverlight.Je pourrais effacer le SelectedItem et le texte mais le SearchText a été laissé pour compte.Il est en lecture seule et ne peut pas être modifié par liaison.

Exemple: AutoCompleteBox avec une liste de pays.Lorsque l'utilisateur veut entrer en Australie, il saisit «au» à ce stade, la liste apparaît avec l'Autriche et l'Australie.L'utilisateur peut alors sélectionner l'Australie et passer à autre chose.À la fin de l'édition, ils cliquent sur un bouton «Enregistrer».À ce stade, il est probable que vous souhaitiez effacer les données forn pour saisir de nouvelles données.

Même si vous avez des liaisons avec les propriétés SelectedItem et Text et que vous les définissez sur 'null' et string.Empty respectivement, la propriété SearchText reste et l'AutoCompleteBox ne sera pas effacée mais contiendra 'au'.

Était-ce utile?

La solution

J'ai posté à ce sujet partout sur Internet, mais je n'ai pas pu obtenir de réponse sur le contrôle lui-même et je l'ai donc abordé sous un angle différent, ce qui peut aider quelqu'un qui finit par être frustré comme moi.

J'utilise une application de modèle de navigation Silverlight qui utilise un NavigationFrame dans lequel charger des pages Silverlight.J'ai remarqué que si je naviguais vers une autre page et retournais à mon formulaire de données, SearchText était effacé.Toutes les valeurs liées à des propriétés restaient valides, seul le SearchText avait été effacé sur toutes les AutoCompleteBoxes.J'ai donc utilisé la méthode PageConductor pour injecter le NavigationFrame dans le ViewModel où je pourrais appeler la méthode de rafraîchissement.J'ai obtenu cette méthode de l ' exemple de John Papa de l'événement Silverlight Firestarter, j'ai simplement ajouté une méthode Refresh à l'interface IPageConductor afinJe peux maintenant appeler «PageConductor.Refresh ()», ce qui revient à recharger la page.J'espère que cela aidera quelqu'un là-bas.

Autres conseils

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

Essayez ceci s'il vous plaît. Cela a fonctionné pour moi

Vous devez effacer la propriété liée au texte dans la partie set de la propriété SelectedItem Binded, comme ceci:

    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);
        }
    }

Ainsi, lorsque vous définissez null sur la propriété SelectedItem, l'autre propriété sera définie sur "".

Le moyen le plus simple que j'ai trouvé est d'étendre l'AutoCompleteBox:

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

Utilisez maintenant votre nouveau contrôle AutoCompleteBoxClear dans votre XAML.

Ceci efface le texte uniquement lorsque le contexte de données de la boîte de saisie semi-automatique passe à null (c'est-à-dire que l'utilisateur clique sur ajouter dans le formulaire de données.)

Remarque: je pense que DataContextChanged n'est disponible que dans Silverlight 5, mais je suppose que quiconque utilise encore Silverlight ces jours-ci aurait probablement mis à niveau maintenant ...

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

Malheureusement, il s'agit d'un code-behind et j'avais besoin d'une solution MVVM.

J'ai récemment eu le même problème avec mon application WPF.J'ai découvert que la solution n'est pas de définir l'objet lié à SelectedItem sur null, mais sur sa valeur par défaut.Il m'a fallu un certain temps pour comprendre cela.Donc, dans votre exemple, ce ne serait pas SelectedCountry = null, mais SelectedCountry = new SelectedCountry().Dans ce cas, SearchText est également effacé.Consultez mon message SO à ce sujet: La boîte de saisie semi-automatique n'efface pas les touches de clavier .

Bien sûr, la propriété SearchText est en lecture seule, mais nous pouvons obtenir le composant enfant d'AutoCompleteBox:

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

Et maintenant, nous pouvons réinitialiser SearchText via la propriété Text du composant TextBox:

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

En C # 6.0, c'est plus laconique:

autoCompBox.GetChildByType<TextBox>(item => item.Name == "Text")?.Text = string.Empty;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top