ValueMemberPath Reliure dans AutoCompleteBox WPF ne retourne que bon résultat dans la dernière recherche de nom?
-
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.
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.