2010-06-23 11 views
2

J'ai un problème avec AutoCompleteBox. Je voulais l'utiliser comme combobox modifiable. J'ai donc créé un contrôle personnalisé héritant de AutoCompletBox et ajouté deux propriétés de dépendances nommées SelectedValue (pour la liaison à DataContext) et SelectedValuePath. Lorsque l'utilisateur sélectionne un élément, mon contrôle personnalisé met à jour SelectedValue de la manière suivante:Silverlight, réinitialisation AutoCompleteBox.SelectedItem à null

string propertyPath = this.SelectedValuePath; 
PropertyInfo propertyInfo = this.SelectedItem.GetType().GetProperty(propertyPath); 
object propertyValue = propertyInfo.GetValue(this.SelectedItem, null); 
this.SelectedValue = propertyValue; 

Cela fonctionne. Inversement, lorsque le contexte de données sous-jacent est modifié, SelectedValue est également modifié; donc SelectedItem du contrôle personnalisé doit également changer:

if (this.SelectedValue == null) 
{ 
    this.SelectedItem = null; //Here's the problem!!! 
} 
else 
{ 
    object selectedValue = this.SelectedValue; 
    string propertyPath = this.SelectedValuePath; 
    if (selectedValue != null && !(string.IsNullOrEmpty(propertyPath))) 
    { 
     foreach (object item in this.ItemsSource) 
     { 
     PropertyInfo propertyInfo = item.GetType().GetProperty(propertyPath); 
     if (propertyInfo.GetValue(item, null).Equals(selectedValue)) 
      this.SelectedItem = item; 
     } 
    } 
} 

Ce qui me gêne, c'est lorsque SelectedValue est null. Même si SelectedItem est défini sur null, la propriété Text n'est pas effacée si elle a été modifiée manuellement par l'utilisateur. Donc SelectedItem = null mais AutoCompleteBox affiche un texte entré manuellement. Quelqu'un peut-il me montrer la bonne façon de réinitialiser la propriété AutoCompleteBox.SelectedItem?

+0

En fait, le code ci-dessus provient de AutoCompleteComboBox; voir: http://www.codeproject.com/KB/silverlight/AutoComplete_ComboBox.aspx – synergetic

Répondre

2

Quelle coïncidence ... Je faisais juste la même chose aujourd'hui. En fait, ne prenez même pas la peine de définir SelectedItem = null. Vous pouvez simplement définir Text = String.Empty et la zone de texte et SelectedItem seront effacées.

+0

Merci Josh, tu as vraiment sauvé ma journée. – synergetic

+0

Content de l'entendre. Faites-moi savoir si vous trouvez un moyen d'utiliser IsTextCompletionEnabled = True * et * afficher tous les éléments dans la liste déroulante lorsque vous ouvrez la zone de liste déroulante. C'est ce qui m'a fait quitter une falaise aujourd'hui. – Josh

+0

En outre, une chose qui m'a vraiment aidé à comprendre les différentes propriétés de AutoCompleteBox et comment ils se comportent sous différents paramètres était de mettre en place trois étiquettes à côté de la boîte. Liez-en un à SelectedItem, un à Text et un à SearchText. Il est intéressant de voir comment/quand les valeurs changent en tapant, en sélectionnant à partir d'une liste déroulante, etc. – Josh

2

qui ne fonctionne pas dans un MVVM mis en place

+0

Je suis confronté au même problème. Comment le faire fonctionner dans MVVM? –

-1

Il est de résoudre le problème:

selectedChange += (e,v) => {if (selected item == null) Text = String.Empty}; 

mais il couse à un autre problème - lorsque vous sélectionnez un objet, et d'insérer plus tard ...