MvvmCross 绑定 + Android EventHandler
MvvmCross binding + Android EventHandler
我在 MvvmCross Android 中有一个情况,我有一个 SeekBar 的位置绑定到视图模型中的 属性。 属性 可以通过滑动搜索栏或通过网络套接字发生的外部 api 交互来更新。如果用户当前正在滑动搜索栏,我不希望外部 api 能够更新 属性 并导致搜索栏明显跳动。
我试图通过在用户开始滑动和停止滑动时设置 IsDimming 属性 来做到这一点。但是,一旦我分配了这些本机 EventHandlers,当您拖动搜索栏时,我的 属性 的 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 中继续正常工作。
非常感谢
汤姆
我怀疑这是由 MvvmCross 绑定和内部 Xamarin 事件处理都使用 SeekbarListener
引起的 - 而 Java 一次只允许其中一个工作。
在 MvvmCross 的情况下,此侦听器位于 https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs#L41
解决此问题的一种方法是:您可以将 MvvmCross 的绑定替换为使用 ProgressChanged
事件处理程序而不是侦听器的自定义绑定。为此:
- 将https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs中的代码复制到您自己的项目中,然后将其重命名为
MySeekBarProgressTargetBinding
- 更改
SubscribeToEvents
代码以使用事件委托订阅而不是侦听器。另外,请务必在 Dispose
中取消订阅。
改变你的Setup
代码为"Progress"注册MySeekBarProgressTargetBinding
(只要你在核心Mvx
之后这样做,那么我认为你会 "win")
registry.RegisterPropertyInfoBindingFactory(typeof(MySeekBarProgressTargetBinding), typeof(SeekBar),
"Progress");
我认为应该可行....
如果您将一些更改推回 Mvx,为每个人解决这个问题(并且也将名称从 Binging
修复为 Binding
),还可以获得额外的奖励积分。我相信当 Mvx 的那个部分被编写时,事件处理程序要么不可用要么不工作(这就是它使用自定义侦听器的原因)。
我在 MvvmCross Android 中有一个情况,我有一个 SeekBar 的位置绑定到视图模型中的 属性。 属性 可以通过滑动搜索栏或通过网络套接字发生的外部 api 交互来更新。如果用户当前正在滑动搜索栏,我不希望外部 api 能够更新 属性 并导致搜索栏明显跳动。
我试图通过在用户开始滑动和停止滑动时设置 IsDimming 属性 来做到这一点。但是,一旦我分配了这些本机 EventHandlers,当您拖动搜索栏时,我的 属性 的 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 中继续正常工作。
非常感谢
汤姆
我怀疑这是由 MvvmCross 绑定和内部 Xamarin 事件处理都使用 SeekbarListener
引起的 - 而 Java 一次只允许其中一个工作。
在 MvvmCross 的情况下,此侦听器位于 https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs#L41
解决此问题的一种方法是:您可以将 MvvmCross 的绑定替换为使用 ProgressChanged
事件处理程序而不是侦听器的自定义绑定。为此:
- 将https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxSeekBarProgressTargetBinging.cs中的代码复制到您自己的项目中,然后将其重命名为
MySeekBarProgressTargetBinding
- 更改
SubscribeToEvents
代码以使用事件委托订阅而不是侦听器。另外,请务必在Dispose
中取消订阅。 改变你的
Setup
代码为"Progress"注册MySeekBarProgressTargetBinding
(只要你在核心Mvx
之后这样做,那么我认为你会 "win")registry.RegisterPropertyInfoBindingFactory(typeof(MySeekBarProgressTargetBinding), typeof(SeekBar), "Progress");
我认为应该可行....
如果您将一些更改推回 Mvx,为每个人解决这个问题(并且也将名称从 Binging
修复为 Binding
),还可以获得额外的奖励积分。我相信当 Mvx 的那个部分被编写时,事件处理程序要么不可用要么不工作(这就是它使用自定义侦听器的原因)。