2015-11-10 3 views
1

Я перефразировать мой вопрос в EDIT 2WPF ComboBox предотвратить событие на выбрать пункт по коду

Все, у меня есть выпадающий в WPF. Когда я устанавливаю свойство SelectedIndex, он запускает событие SelectionChanged, что является правильным поведением. Но я хочу, чтобы ComboBox не запускал событие, когда я устанавливал свойство SelectedIndex программно. Есть ли способ сделать это?

Я использую .Net 4.5

EDIT 1: Код

public void AddLocation() 
{ 
    List<String> locations = new List<String>(); 

    //LocationBox is the name of ComboBox 
    LocationBox.ItemsSource = locations; 

    locations.Add("L1"); 
    locations.Add("B1"); 
    locations.Add("B3"); 
    LocationBox.SelectedIndex = 2; //<-- do not want to raise SelectionChanged event programmatically here 
    locations.Add("G1"); 
    locations.Add("G2"); 
    locations.Add("F1"); 
    locations.Add("F3"); 
} 

private void LocationBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    Console.WriteLine(LocationBox.SelectedIndex); 
} 

EDIT 2: Перефразируя вопрос

Я хочу, чтобы выбрать элемент в ComboBox беззвучно т.е. без взаимодействия с пользователем (используя код/​​программно), поэтому он не запускает событие SelectionChanged. Как я могу это сделать?

+0

Когда вы выбираете конкретный индекс, вы хотите, чтобы это поле со списком не работало? – HighEndGuy

+0

Когда я программно выбираю конкретный индекс, ComboBox запускает событие SelectionChanged. Я не хочу этого в конкретном случае в моем коде. С другой стороны, он должен запускать событие SelectionChanged, когда пользователь взаимодействует с огнем ComboBox –

+0

? я не понимаю .. если вы объясните, что слова легко понять, я могу вам помочь :) и вы должны загрузить свой исходный код – HighEndGuy

ответ

0

Caveat для этого Ответа:

  • Это хак.
  • Это плохо.

Я даю вам право на сомнение в том, что, возможно, вы находитесь в дилемме изменения существующего кода (или, возможно, некоторых других причин). С учетом кода примера вы можете достичь того, чего вы пытаетесь достичь по этому коду:

// Remove the handler 
LocationBox.SelectionChanged -= LocationBox_SelectionChanged; 
// Make a selection... 
LocationBox.SelectedIndex = 2; //<-- do not want to raise SelectionChanged event programmatically here 
// Add the handler again. 
LocationBox.SelectionChanged += LocationBox_SelectionChanged; 
+0

Просто ответил на ваш вопрос выше. –

+0

На самом деле я имею в виду то же самое, чтобы удалить и добавить обработчик, и я немного неохотно использовал этот подход. –

+0

Если у вас есть обработчик, невозможно НЕ иметь, если он поднят, когда вы делаете выделение. Я так думаю. Основываясь на вашем ответе на мой вопрос выше, я думаю, вы можете достичь этого на уровне VM, а не на уровне просмотра. Но я думаю, что это требует другого вопроса. – tgpdyk

0

Я предполагаю, что вы пытаетесь не запускать событие, когда вы инициализируете комбо. Для этого вы можете использовать DataBinding. Ниже приведен пример, но вы можете найти шаблон MVVM для получения более подробной информации.

XAML:

<ComboBox ItemsSource="{Binding CBItems}" 
      SelectedIndex="{Binding SelectedCBItem}" /> 

CS:

public class ModelExample : INotfyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private int selectedCBItem; 
    public int SelectedCBItem 
    { 
     get { return selectedCBItem; } 
     set 
     { 
      selectedCBItem = value; 
      NotifyPropertyChanged(nameof(SelectedCBItem)); 
     } 
    } 

    private List<ComboBoxItem> cbItems; 
    public List<ComboBoxItem> CBItems 
    { 
     get { return cbItems; } 
     set 
     { 
      cbItems= value; 
      NotifyPropertyChanged(nameof(CBItems)); 
     } 
    } 

    private void NotifyPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

public class ExampleWindow 
{ 
    ... 

    private ModelExample Model; 

    private void Initialize() 
    { 
     ... 
     this.DataContext = Model = new ModelExample(); 

     List<ComboBoxItem> items = // initialize your items somehow 
     items.Add(new ComboBoxItem() { Content = "dummy item 1" }); 
     items.Add(new ComboBoxItem() { Content = "dummy item 2" }); 

     Model.CBItems = items; 
     Model.SelectedCBItem = 1; 
    } 
} 
Смежные вопросы