【问题标题】:MvvmCross binding + Android EventHandlerMvvmCross 绑定 + Android EventHandler
【发布时间】:2015-01-19 17:36:02
【问题描述】:

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

我试图通过在用户开始滑动和停止滑动时设置 IsDimming 属性来做到这一点。但是,一旦我分配了这些本机 EventHandler,当您拖动搜索栏时,我的属性的 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 中继续正常工作。

非常感谢

汤姆

【问题讨论】:

    标签: android xamarin mvvmcross


    【解决方案1】:

    我怀疑这是由使用 SeekbarListener 的 MvvmCross 绑定和内部 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 的那部分时,事件处理程序要么不可用,要么不工作(这就是它使用自定义侦听器的原因)。

    【讨论】:

    • 感谢斯图尔特为我指明正确的方向。我曾认为在绑定代码中不太可能使用 OnStartTrackingTouch 和 OnStopTrackingTouch,实际上我可以看到它们不是。但是分配给它们必须导致整个 SeekBarChangeListener 被替换。我想我可能可以按照您的建议将此绑定转换为使用事件处理程序,并且很乐意将其贡献回项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2016-03-13
    • 2015-04-03
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多