2009-06-14 4 views
0

J'ai une liste déroulante dont la propriété ItemsSource est liée à une propriété ObservableCollection et sa propriété SelectedIndex est liée à une propriété entière respectivement.Pourquoi l'implémentation d'ObservableCollection plante-t-elle mon application Silverlight?

<ComboBox Name="cmbDealt" ItemsSource="{Binding Path=DealList, Mode=TwoWay}" SelectedIndex="{Binding Mode=TwoWay, Path=DealIndex}"></ComboBox> 
<CheckBox IsChecked="{Binding Mode=TwoWay, Path=SomeCondition}" Content="Some Condition"></CheckBox> 

Ma structure de données ressemble

private ObservableCollection<string> m_DealList = null; 
    private int m_DealIndex = 0; 
    private bool m_SomeCondition = false; 

    public ObservableCollection<string> DealList 
    { 
     get 
     { 
      if (m_DealList == null) 
       m_DealList = new ObservableCollection<string>(); 
      else 
       m_DealList.Clear(); 

      if (m_SomeCondition) 
      { 
       m_DealList.Add("ABC"); 
       m_DealList.Add("DEF"); 
      } 
      else 
      { 
       m_DealList.Add("UVW"); 
       m_DealList.Add("XYZ"); 
      } 
      return m_DealList; 
     } 
    } 

    public int DealIndex 
    { 
     get { return m_DealIndex; } 
     set 
     { 
      if (value != -1) 
      { 
       m_DealIndex = value; 
      } 
     } 
    } 

    public bool SomeCondition 
    { 
     get { return m_SomeCondition; } 
     set 
     { 
      m_SomeCondition = value; 
      OnPropertyChanged("DealList"); 
      OnPropertyChanged("DealIndex"); 
     } 
    } 

avec succès Maintenant, les charges d'application. Toutefois, lorsque l'utilisateur modifie l'élément SelectedIndex de la zone de liste déroulante à 1 à partir de 0, puis coche la case à cocher (afin d'appeler l'événement modifié de la propriété "DealIndex"), l'application se bloque.

Je ne sais pas pourquoi cela pourrait se produire. Quelqu'un peut-il faire la lumière et proposer une solution?

TIA ... Sudeep

Répondre

0

Une option serait de modifier la liaison de selectedIndex à selectedItem. vous pouvez accomplir la même chose. J'ai d'abord commencé en essayant de changer selectedindex et je n'ai jamais réussi. Je pense que c'est peut-être seulement en lecture.

+0

Salut Zachary, SelectedIndex fonctionne bien dans les scénarios normaux. Ce n'est que lorsque nous essayons d'actualiser-n-relier la collection, puis que nous définissons l'élément SelectedIndex immédiatement, qu'il échoue. Je lisais sur un blog qu'il semble que OnPropertyChanged() de ObservableCollection prend un peu de temps, donc quand OnPropertyChanged() de SelectedIndex est déclenché juste après OnPropertyChanged() de ObservableCollection, il n'y a probablement pas de données pour définir l'index. J'ai testé cela d'une manière grossière et cela s'avère peut-être vrai. Mais je suis toujours déconcerté par cela et j'attends une bonne approche. – Sudeep

0

Vous n'avez pas besoin de tirer

OnPropertyChanged("DealList"); 

que la propriété est un ObservableCollection. Cela signifie qu'il implémente le modèle d'observateur et lorsque les éléments sont ajoutés et supprimés, il se déclenche tout seul.

Il n'est pas nécessaire que le mode de liaison de ObservableCollection soit défini sur TwoWay, sauf si l'utilisateur peut mettre à jour les éléments via l'interface utilisateur. Il ne semble pas que votre code le permette.

Vous pouvez également simplement utiliser SelectedIndexChanged sur la zone de liste déroulante au lieu d'effectuer une action sur le composant CheckBox, sauf s'il existe plusieurs CheckBox. C'est juste une réflexion sur la fourniture d'une meilleure expérience utilisateur.

Questions connexes