2015-01-19 2 views
2

У меня есть ситуация в Android MvvmCross, где у меня есть позиция SeekBar, связанная с свойством в модели представления. Свойство может быть обновлено путем сдвига полосы поиска или внешнего взаимодействия api, происходящего через сетевые сокеты. Если пользователь в настоящее время сдвигает строку поиска, я не хочу, чтобы внешний api мог обновить свойство и заставить панель поиска заметно перемещаться.MvvmCross binding + Android EventHandler

Я пытаюсь сделать это, установив свойство IsDimming, когда пользователь начнет скользить и перестанет скользить. Однако, как только я назначу эти собственные EventHandlers, часть {} части моего свойства больше не будет ударяться при перетаскивании строки поиска.

Связывание в представлении XML:

<SeekBar 
    android:layout_width="120dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:id="@+id/seekBar" 
    android:max="100" 
    local:MvxBind="Progress DimmerPosition" /> 

Свойства в модели представления:

public bool IsDimming { get; set; } 

private float _dimmerPosition; 
public float DimmerPosition { 
    get { 
     return _dimmerPosition; 
    } 
    set { // This isn't hit when I have assigned native event handlers 
     _dimmerPosition = value; 
     _eventService.SendLightingState (UUIDAction, Number, value); 
     RaisePropertyChanged (() => DimmerPosition); 
    } 
} 

Мои родные обработчики для Android событий в коде зрения позади:

var slider = FindViewById<SeekBar> (Resource.Id.seekBar); 
slider.StartTrackingTouch += (object sender, SeekBar.StartTrackingTouchEventArgs e) => { 
    ViewModel.IsDimming = true; 
}; 

slider.StopTrackingTouch += (object sender, SeekBar.StopTrackingTouchEventArgs e) => { 
    ViewModel.IsDimming = false; 
}; 

Есть каким-либо образом я могу иметь привязку И использовать обработчики событий? Стоит отметить, что привязка продолжает работать нормально в iOS, когда я назначаю обработчики событий TouchDown и TouchUpInside.

Большое спасибо

Том

ответ

2

Я подозреваю, что это вызвано как связывающим MvvmCross и внутренней обработки как с помощью SeekbarListener «S Xamarin событие - в то время как Java позволяет только один из них работать одновременно.

В случае MvvmCross, этот слушатель находится в https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs#L41

Один пути вокруг этого для вашего случая: вы могли бы заменить MvvmCross, обязательным с пользовательской привязкой, который использует обработчик события с ProgressChanged вместо слушателя. Для этого:

  1. Скопируйте код из https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs в свой собственный проект, а затем переименовать его в MySeekBarProgressTargetBinding
  2. Измените SubscribeToEvents код, чтобы использовать подписку делегата события вместо слушателя. Кроме того, обязательно отмените подписку на номер Dispose.
  3. Изменить Setup код для регистрации MySeekBarProgressTargetBinding для «Прогресс» (до тех пор, как вы делаете это после того, как ядро ​​Mvx один, то я думаю, что ваш один будет «выиграть»)

    registry.RegisterPropertyInfoBindingFactory(typeof(MySeekBarProgressTargetBinding), typeof(SeekBar), 
                  "Progress"); 
    

Я думаю, которые должны работать ....

Дополнительные бонусные баллы также доступны, если вы нажмете некоторые изменения обратно в Mvx, которые адресовали это для всех (и это исправить имя от Binging до Binding). Я считаю, что когда этот бит Mvx был написан, обработчики событий либо были недоступны, либо не работали (поэтому он использовал пользовательский прослушиватель).

+0

также зарегистрирован как https://github.com/MvvmCross/MvvmCross/issues/884 – Stuart

+0

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

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