MvvmCross绑定+ Android EventHandler

时间:2015-01-19 17:36:02

标签: android xamarin mvvmcross

我在MvvmCross Android中有一种情况,我将SeekBar的位置绑定到视图模型中的属性。可以通过滑动搜索栏或通过Web套接字进行的外部api交互来更新属性。如果用户当前正在滑动搜索栏,我不希望外部api能够更新属性并导致搜索栏明显跳转。

我正在尝试通过在用户开始滑动并停止滑动时设置IsDimming属性来执行此操作。但是,只要我分配这些本机EventHandler,拖动搜索栏时就不会再触发my属性的set {}部分。

在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;
};

有没有办法让绑定和使用事件处理程序?值得注意的是,当我分配给TouchDown和TouchUpInside事件处理程序时,绑定在iOS中继续正常工作。

非常感谢

汤姆

1 个答案:

答案 0 :(得分:2)

我怀疑这是由MvvmCross绑定和使用SeekbarListener的内部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以获取&#34;进度&#34; (只要您在核心Mvx之后执行此操作,那么我认为您的人将会#34;赢得&#34;)

    registry.RegisterPropertyInfoBindingFactory(typeof(MySeekBarProgressTargetBinding), typeof(SeekBar),
                                                "Progress");
    
  4. 我认为应该有用......

    如果您将某些更改推回到Mvx,并为每个人解决此问题(并将名称从Binging修复为Binding),也可以获得额外奖励积分。我相信当编写Mvx的那一点时,事件处理程序要么不可用,要么不起作用(这就是为什么它使用自定义监听器)。