2017-01-23 3 views
0

Есть ли эффективный способ определить, было ли событие Xamarin.Forms.ValueChangedEventArgs связано с вводом пользователем или программным обновлением?Xamarin.Forms - Как появился слайдер ValueChanged?

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

В основном, я ищу Xamarin.Forms эквивалент SeekBar.ProgressChangedEventArgs.FromUser собственности в Xamarin.Android.

Любые идеи? Благодаря!

+0

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

+0

@ChrisDunaway Я целенаправленно изменяю значение слайдера программно в разных точках, но я хочу, чтобы обработчик события игнорировал их. Обработчик событий должен реагировать только тогда, когда пользователь меняет ползунок, вручную сдвигая его. – Jonathan

+0

Единственный способ, которым я это знаю, - установить bool непосредственно перед его программным изменением, а затем проверить bool внутри обработчика событий. –

ответ

0

Весь смысл MVVM заключается в том, что свойство, которое ваш слайдер связывает, должно представлять положение ползунка и ничего больше. Что касается остальной части вашего логического кода модели просмотра, то это свойство ползунка IS слайдер. Вы не должны подклассифицировать весь элемент управления только для определения того, где его значение было задано, потому что эта логика намного проще делать в коде, который использует ваш контроль. MVVM не отличается от другого, т. Е. Помещает такую ​​логику в свойство, что ваш элемент управления представлением данных разбивает шаблон, потому что свойство должно иметь отношение 1: 1 к свойству элемента управления.

Из вашего описания, это звучит, как вы пытаетесь сделать что-то вроде этого:

public int SliderPos 
{ 
    set 
    { 
     if (valueChangedManually()) // <-- magic function 
      ManualChangeFunction(); 
    } 
    // ... etc ... 
} 

void ChangeSliderPosManually() 
{ 
    SliderPos = 100; 
} 

Если да, то вам нужно вместо этого делать:

public int SliderPos 
{ 
    set 
    // ... etc ... 
} 

void ChangeSliderPosManually() 
{ 
    ManualChangeFunction(); 
    SliderPos = 100; 
} 

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

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

Смежные вопросы