2009-12-03 3 views
0

Этот код дает мне исключение «Аргумент вне диапазона». Когда я удаляю привязку к SelectedIndex, ComboBox заполняется просто отлично, и никакое исключение не выбрасывается.WPF - привязка к элементу ItemsSource и SelectedIndex выбрасывает исключение?

Любая идея, что я делаю неправильно? Это (по какой-то причине) невозможно?

Код:

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

См. Ответ ниже (не может отметить себя в течение 2 дней). –

ответ

1

Оказалось, что контроль ComboBox был принципиально нарушен для начала. Благодаря этому Blog Post от Rockford Lhotka мы смогли переопределить элемент управления ComboBox тем, который может корректно привязываться к свойству SelectedItem.

Ick.

1

Я думаю, что SelectedIndex это ReadOnly Property.
Другая проблема может быть, что 0 это не в коллекции

1

Я думаю, что товары не добавлены до SelectedIndex является переплетены, а так как нет ни одного пункта, он показывает аргумент из исключения Range.

+1

Это правда, но не решение проблемы :) –

0

Я бы не стал возвращать новую коллекцию из вашего свойства Options. Вы принимаете предположение, что WPF получает доступ к ресурсу только один раз.

Но у вас также есть возможность использовать CollectionView, в котором вы сейчас возвращаете ObservableCollection. Если вы используете архитектуру MVVM, ваш ViewModel может выставить свойство как CollectionView, и у него есть понятие «текущего» элемента.