2009-12-03 8 views
0

Ce code me donne une exception "Argument hors de portée". Lorsque je supprime la liaison au SelectedIndex, le ComboBox est rempli correctement et aucune exception n'est levée.WPF - Liaison à un ItemsSource ET SelectedIndex génère une exception?

Une idée de ce que je fais mal? Est-ce (pour une raison quelconque) pas possible?

code:

public class RuleMap<T> : INotifyPropertyChanged 
{ 
    public ObservableCollection<string> Options 
    { 
     get 
     { 
      return new ObservableCollection(){"A", "B", "C"}; 
     } 
    } 

    public int SelectedIndex 
    { 
     get 
     { 
      return 0; 
     } 
    } 
} 

public ObservableCollection<RuleMap> FilterItemSource; 

XAML:

<ItemsControl ItemsSource="{Binding FilterItemSource}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal">         <ComboBox Width="150" SelectedIndex="{Binding SelectedIndex}" 
          ItemsSource="{Binding Options}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 
+0

Voir la réponse ci-dessous (ne peut pas me marquer pendant 2 jours). –

Répondre

1

Transforme le contrôle ComboBox était fondamentalement cassé pour commencer. Merci à ce Blog Post par Rockford Lhotka, nous étions en mesure de remplacer le contrôle ComboBox avec un qui pourrait correctement lier à la propriété SelectedItem.

Ick.

1

Je suppose que SelectedIndex est une propriété ReadOnly.
Autre problème peut être 0 il n'est pas dans la collection

1

Je pense que les éléments ne sont pas ajoutés avant que selectedIndex soit lié, et puisqu'il n'y a aucun élément, il montre l'exception Argument hors de portée.

+1

Ceci est vrai, mais pas la solution au problème :) –

0

Je voudrais éviter de retourner une collection nouvelle de votre propriété Options. Vous faites l'hypothèse que WPF n'accède à la propriété qu'une seule fois.

Mais vous avez aussi la possibilité d'utiliser un CollectionView où vous retournez actuellement un ObservableCollection. Si vous utilisez une architecture MVVM, votre ViewModel peut exposer la propriété en tant que CollectionView et il a la notion d'un élément "en cours".