Как избежать возникновения события ComboBox SelectionChanged при выполнении этого в codebehind в WPF? - PullRequest
0 голосов
/ 04 августа 2011

У меня есть функция, которая будет изменять выбранный индекс поля со списком, поэтому событие combobox_selectionchanged будет автоматически повышаться, но обработчик этого события снова вызывает мою функцию, поэтому функция будет вызываться дважды !!

Есть ли способ предотвратить возникновение события selection_changed в функции ниже?

private void Refresh_Window()
{
    Monthes_ComboBox.SelectedIndex = DM.Month - 1;
}

Я хотел избежать подробного описания моей проблемы, поэтому я просто задал вопрос. Я создаю календарь, combo_box содержит месяцы года, но есть две кнопки, которые будут переходить на следующий месяц или предыдущий месяц, поэтому мне нужно изменить индекс combo_box по коду, я создаю функцию и вызываю ее в form_load и combobox_Selection_changed и button_click Могу ли я создать его лучше? и Refresh_window не просто изменяет combobox_selectedindex, он меняет все метки и текстовые блоки в форме, поэтому я просто хотел, чтобы все изменения были сделаны с помощью Refresh_window

Ответы [ 3 ]

1 голос
/ 04 августа 2011
private bool _refreshCalled = false;

private void Refresh_Window()
{
    _refreshCalled = true;
    try
    {
        ....
        Monthes_ComboBox.SelectedIndex = DM.Month - 1;
        ....
    }
    finally
    {
        _refreshCalled = false;
    }
}

private void OnComboBoxSelectedChanged(object sender, EventArgs e)
{
     ...
     if (!_refreshCalled)
     {
         Refresh_Window();
     }
     ...
}
0 голосов
/ 04 августа 2011

Есть несколько хороших способов сделать это:

  • Установите переменную, которая указывает, что выбранный индекс изменяется в выпадающем списке (вам нужно будет извлечь из встроенногов классе ComboBox).Если выбранный индекс снова изменится из глубины в стеке вызовов, переменная все равно будет установлена, и вы сможете прочитать ее, прежде чем пытаться снова изменить выбранный индекс.

  • Аналогично, если стек вызововвключает в себя обработчики, прикрепленные к списку, вы можете переопределить OnSelectedIndexChanged и не выполнять никакой логики, если это второй раз, когда выбранный индекс изменился.

0 голосов
/ 04 августа 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...