2013-05-09 3 views
2

У меня есть два ComboBoxes на моем представлении. Оба из них связаны с двумя разными ObservableCollections в ViewModel, и когда выбранный элемент в ComboBox1 изменен, ComboBox2 обновляется с другой коллекцией. Связывание работает очень хорошо, однако я хочу, чтобы второй ComboBox всегда выбирал первый элемент в своей коллекции. Первоначально он работает, однако, когда источник и элементы в ComboBox2 обновляются, индекс выбора изменяется на -1 (т. Е. Первый элемент больше не выбран).ComboBox.SourceUpdated событие не запущено

Чтобы исправить это, я добавил событие ComboBox2 в SourceUpdated и метод, который событие вызывает изменение индекса обратно на 0. Проблема состоит в том, что метод никогда не вызывается (я поставил точку останова на самой вершине метода и он не попадает). Вот мой код XAML:

<Grid> 
    <StackPanel DataContext="{StaticResource mainModel}" Orientation="Vertical"> 
     <ComboBox ItemsSource="{Binding Path=FieldList}" DisplayMemberPath="FieldName" 
        IsSynchronizedWithCurrentItem="True"/> 

     <ComboBox Name="cmbSelector" Margin="0,10,0,0" 
        ItemsSource="{Binding Path=CurrentSelectorList, NotifyOnSourceUpdated=True}" 
        SourceUpdated="cmbSelector_SourceUpdated"> 
     </ComboBox>  
    </StackPanel> 
</Grid> 

А в коде-за:

// This never gets called 
private void cmbSelector_SourceUpdated(object sender, DataTransferEventArgs e) 
{ 
    if (cmbSelector.HasItems) 
    { 
     cmbSelector.SelectedIndex = 0; 
    } 
} 

Любая помощь приветствуется.

ответ

3

После работы над ним в течение часа я, наконец, понял это. Ответ на этот вопрос основан на этом вопросе: Listen to changes of dependency property.

Таким образом, вы можете определить событие «Свойство изменено» для любого DependencyProperty на объекте. Это может быть очень полезно, когда вам нужно расширить или добавить дополнительные события в элемент управления без необходимости создания нового типа. Основная процедура таково:

DependencyPropertyDescriptor descriptor = 
    DependencyPropertyDescriptor.FromProperty(ComboBox.ItemsSourceProperty, typeof(ComboBox)); 

descriptor.AddValueChanged(myComboBox, (sender, e) => 
{ 
    myComboBox.SelectedIndex = 0; 
}); 

Что это делает, что он создает DependencyPropertyDescriptor объекта для ComboBox.ItemsSource собственности, а затем вы можете использовать этот дескриптор для регистрации события для любого управления этого типа. В этом случае каждый раз, когда изменяется свойство ItemsSourcemyComboBox, свойство SelectedIndex установлено на 0 (это означает, что выбран первый элемент в списке.)