android - MvvmCross绑定(bind)+Android EventHandler

标签 android xamarin mvvmcross

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

我尝试通过在用户开始滑动和停止滑动时设置 IsDimming 属性来实现此目的。然而,一旦我分配了这些 native EventHandler,当您拖动搜索栏时,我的属性的 set {} 部分就不再被命中。

在 XML View 中绑定(bind):

<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" />

View 模型中的属性:

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 事件处理程序位于 View 的代码后面:

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

有什么方法可以让我绑定(bind)并使用事件处理程序吗?值得注意的是,当我分配给 TouchDown 和 TouchUpInside 事件处理程序时,绑定(bind)在 iOS 中继续正常工作。

非常感谢

汤姆

最佳答案

我怀疑这是由 MvvmCross 绑定(bind)和内部 Xamarin 事件处理均使用 SeekbarListener 引起的 - 而 Java 一次只允许其中之一工作。

在 MvvmCross 的例子中,这个监听器位于 https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs#L41

针对您的情况,解决此问题的一种方法是:您可以将 MvvmCross 的绑定(bind)替换为自定义绑定(bind),该绑定(bind)使用 ProgressChanged 事件处理程序而不是监听器。为此:

  1. 复制 https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs 中的代码到您自己的项目中,然后将其重命名为 MySeekBarProgressTargetBinding
  2. 更改 SubscribeToEvents 代码以使用事件委托(delegate)订阅而不是监听器。另外,请务必在 Dispose 中取消订阅。
  3. 更改您的 Setup 代码,为“Progress”注册 MySeekBarProgressTargetBinding(只要您在核心 Mvx 之后执行此操作) ,那么我认为你会“赢”)

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

我认为这应该可行......

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

关于android - MvvmCross绑定(bind)+Android EventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28030458/

相关文章:

android - 在 android xamarin 中向微调器添加背景颜色和图像

android - 如何使用 sagemaker 部署预训练模型?

java - 安卓表情实现

android - tools.build :gradle:2. 3.1 感染了 HEUR :Trojan. AndroidOS.Boogr.gsh

c# - Mvx绑定(bind) :Error: View type not found - mvvmemiextensions. EmiDatePicker

android - 更新到 MvvmCross 6.2.2 后无法解析自定义 Android ViewPresenter 中的 IMvxViewModelLoader 实例

xamarin.ios - mvvmcross 与 Xamarin.Forms

java - ProGuard 错误 : The output jar is empty. 您是否指定了正确的 '-keep' 选项?

c# - Android和iOS不异步时如何处理UWP异步?

c# - Xamarin Forms - 实现单例