ValueMemberPath Reliure dans AutoCompleteBox WPF ne retourne que bon résultat dans la dernière recherche de nom?

StackOverflow https://stackoverflow.com/questions/4648527

  •  09-10-2019
  •  | 
  •  

Question

J'utilise AutoCompleteBox dans la boîte à outils WPF et juste de tous mes MEETS besoins, tout sauf ce ValueMemberPath gênant la liaison. Ceci est la valeur que le suggèrent boîte terminerons par auto.

J'ai donc ce dernier champ de nom, et lorsqu'un utilisateur commence à taper dans un nom, je récupère dynamiquement les 10 résultats sur cette base. Toutefois, si les types d'utilisateur dans « Smith » et sélectionne dire le nom 4 dans la liste, il récupère toujours le premier résultat dans la liste de suggestions, car ValueMemberPath est réglé sur le filtre par LastName. Il a toujours pense juste « Smith » est le premier résultat même s'il y a 50 serruriers avec différents prénoms.

Je suis creusé mon cerveau à essayer de comprendre comment incorporer prénom avec cette propriété. J'ai essayé de changer ValueMemberPath d'être un champ de FullName qui égalait nom et prenom. La boîte suggèrent arrête le tri dès qu'une virgule est entré, ou si elle est prenom « espace » qui ne fonctionne lastname pas non plus.

J'ai aussi rencontré des problèmes avec ValueMemberPath parce que cette valeur ne peut pas être modifié de manière dynamique, et il y a bug où il est nul lors du débogage: AutoCompleteBox Bug:. ValueMemberPath est nul

Je comprends si on ne dispose d'une solution complète. Je pensais juste que je poserais la question au cas où les gens courent dans à l'avenir et ne suis pas sûr de savoir comment gérer cela.

Était-ce utile?

La solution

Ceci est un bogue dans le AutoCompleteBox. Interne au contrôle des propriétés ValueMemberPath et ValueMemberBinding sont mises en œuvre au moyen d'un type appelé BindingEvaluator. Cette classe est une FrameworkElement que les utilisations de AutoCompleteBox à faire valeur indirecte obligatoire.

Le problème est que lorsqu'un BindingEvaluator est déconnecté de l'arbre logique, la liaison ne fonctionne pas. Voici comment AutoCompleteBox doit gérer son BindingEvaluator pour que cela fonctionne:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    DataContext = new { FirstName = "Bill", LastName = "Smith" };
    var valueBindingEvaluator = new BindingEvaluator<string>();
    AddLogicalChild(valueBindingEvaluator);
    valueBindingEvaluator.ValueBinding = new Binding("FirstName");
    var value = valueBindingEvaluator.GetDynamicValue(DataContext);
}

Ceci est un bug assez facile à résoudre si vous êtes prêt à recompiler la boîte à outils WPF vous.

public Binding ValueMemberBinding
{
    get
    {
        return _valueBindingEvaluator != null ?
            _valueBindingEvaluator.ValueBinding : null;
    }
    set
    {
        if (_valueBindingEvaluator == null)
        {
            _valueBindingEvaluator = new BindingEvaluator<string>();
            AddLogicalChild(_valueBindingEvaluator);
        }
        _valueBindingEvaluator.ValueBinding = value;
    }
}

Cette version corrige aussi le bug lié à vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top