2010-08-10 8 views
1

Im ayant un très drôle problème dans WPFWPF ComboBox SelectedItem enfer

Im la création d'un Combobox par le code, et en ajoutant à un contrôle.

Lorsque je définis Combobox.SelectedItem ou Combobox.SelectedIndex ou Combobox.SelectedValue, je ne peux pas sélectionner une autre option dans les éléments Combox.

ForeignKeyDisplayAttribute attribute = (ForeignKeyDisplayAttribute)this.GetAttribute(typeof(ForeignKeyDisplayAttribute), property); 
if (attribute != null) 
{ 
    ForeignKeyDisplayAttribute fkd = attribute; 
    Type subItemType = fkd.ForeignKeyObject; 
    contentControl = new ComboBox(); 
    object blankItem = System.Activator.CreateInstance(subItemType, new object[] { }); 
    System.Reflection.MethodInfo method = subItemType.GetMethod("Load", new Type[] { typeof(int) }); 
    object innerValue = method.Invoke(null, new object[] { value }); 
    System.Collections.IList selectedSubItems = (System.Collections.IList)subItemType.GetMethod("Load", Type.EmptyTypes).Invoke(null, new object[] { }); 
    selectedSubItems.Insert(0, blankItem); 
    ((ComboBox)contentControl).SelectedValuePath = fkd.IdField; 
    ((ComboBox)contentControl).DisplayMemberPath = fkd.DescriptionField; 
    ((ComboBox)contentControl).ItemsSource = selectedSubItems; 
    ((ComboBox)contentControl).InvalidateVisual(); 
    // If I use any of the two below lines or SelectedItem then I can't change the value via the UI. 
    ((ComboBox)contentControl).SelectedIndex = this.FindIndex(selectedSubItems, value); 
    ((ComboBox)contentControl).SelectedValue = value; 
} 

Une idée est de savoir comment je peux résoudre ce problème?

+1

Beaucoup de code (nous ne pouvons pas compiler). Y a-t-il une chance de reproduire cela dans un programme minimal mais complet? –

+0

Ill voir ce que je peux faire, sa partie d'une plus grande procédure. Mais je suis sûr que je peux concocter un échantillon. –

Répondre

0

Bien trouvé la réponse.

Il s'avère que j'avais incorrectement codé la méthode Equals de l'objet substitué, et qu'elle renvoyait toujours false.

public override bool Equals(object obj) 
    { 
     if (obj is IId) 
      return this.Id.Equals(((IId)obj).Id); 
     return false; 
    } 

aurait dû être

public override bool Equals(object obj) 
    { 
     if (obj.GetType() == this.GetType() && obj is IId) 
      return this.Id.Equals(((IId)obj).Id); 
     return false; 
    } 
0

Avez-vous Manchettes sur ces éléments ComboBox dans l'interface graphique? Ensuite, la raison simple est la suivante: la définition manuelle d'une valeur dans le code détruit la liaison.

workarround: Avant de régler la valeur que vous pouvez manuellement obtenir la liaison avec les BindingOperations fonctions statiques.

Binding b = BindingOperations.GetBinding(yourComboBox, ComboBox.SelectedItemProperty); 

// do your changes here 

BindingOperations.SetBinding(yourComboBox, ComboBox.SelectedItemProperty, b); 

Jan

+0

Non, je fais les liaisons le long chemin (impossible de faire fonctionner la liaison de données) –