WP7 Toolkit - Как я могу игнорировать такие события, как события ListPicker «SelectionChanged» и ToggleSwitch «Checked» при изменении с помощью кода (а не пользовательского ввода)?

Я новичок в XAML и C #, но мне понравилось работать с ними в течение пары недель, когда я играл с ними. Я начал работать над приложением и собрал простую страницу «Настройки» в XAML; теперь я пытаюсь подключить события к элементам управления, чтобы (а) обновить состояние приложения, когда пользователь взаимодействует с ними, и (б) получить текущее состояние при посещении страницы.

Я столкнулся с двумя (связанными) препятствиями:

  • инструментарий: элемент управления ListPicker, похоже, не работает хорошо, когда я определяю ListPickerItem в XAML, поэтому в конструкторе SettingsPage я установил содержимое вручную:

     lpColour.ItemsSource = new List  ()
    {
     «Красный», «Синий», «Зеленый», «Пользовательский…»
    };
    lpColour.SelectedIndex = 1; // устанавливаем текущий выбранный элемент на "Синий"
    

    Однако, поскольку элемент управления (lpColour в этом примере) имеет событие для SelectionChanged, запускаются два события (одно с выбранным красным цветом при заполнении поля, а второе - с выбранным синим). Я не хочу сейчас обрабатывать "SelectionChanged"; только когда пользователь сам взаимодействовал с элементом управления (например,если они выберут «Custom…», я могу открыть отдельное текстовое поле и сфокусировать его; но я не хочу этого делать, когда я настраиваю страницу и у них ранее было выбрано «Custom…», иначе пользователь получит клавиатуру, как только откроет страницу настроек ...)

  • Точно так же я обнаружил, что элементы управления ToggleSwitch будут запускать события «Checked» и «Unchecked», когда свойство «IsChecked» изменяется на что-то новое. Опять же, есть ли способ игнорировать или подавлять это событие при изменении кода? (Я как бы обошел это сейчас, просто используя "Clicked", но с точки зрения обучения было бы неплохо знать, как с этим справиться).

Я подумал, может быть, есть какой-то способ получить «происхождение» (например, «код» или «пользовательский ввод») события из «SelectionChangedEventArgs» или «RoutedEventArgs» ... но, может быть, нет?

Я также попытался установить "инициализированное" значение типа bool (по умолчанию "false", установлено значение "true" после запуска конструктора, и обернуть код обработки событий чем-то вроде "if (initialized) {...}"; но, похоже, событие все еще сработало после того, как Конструктор был создан для кода lpColour.ItemSource = ... и lpColour.SelectedIndex = 1, который был выполнен, когда "initialized" был "false". Очень странно.: P

Надеюсь, я объясняю это четко - я никогда не писал здесь раньше!

Буду признателен за любую помощь, которую вы могли бы предложить. Спасибо!

ОБНОВЛЕНИЕ - спасибо за ответ @ MyKuLLSKI, это дал мне отличное место для работы.

В качестве примечания, основываясь на этой идее, я попытался сохранить их как «List» изначально и иметь «IgnoreSelectionChanged» как int, который будет «вести обратный отсчет» (поэтому перед установкой ItemSource ListPicker я бы установил «IgnoreSelectionChanged + = 2 "(чтобы учесть два события, которые будут запущены); аналогичным образом я бы установил" IgnoreSelectionChanged ++ "непосредственно перед установкой SelectedIndex вручную ... это, похоже, тоже сработало.

Однако, используя границу" ObservableCollection " к ListPicker, и полагаться на него для сообщения об изменениях, возможно, лучше, чем использовать собственное событие ListPicker «SelectionChanged», поэтому я изменю свой код, чтобы использовать его.

Еще раз спасибо!

5
задан CyberDog 13 January 2012 в 03:06
поделиться