我以N+1天为例,构建了一个显示中心坐标的映射应用程序。该值是双向的,因此移动贴图也会更改该值。现在我想绑定zoomlevel,但由于未知原因,该值只被初始化,而没有更新。仔细检查,我发现视图模型中ZoomLevel属性的"Set"部分只调用过一次。
这里有一些代码片段:
在模型视图中,我有这样的属性:
private float _zoomLevel;
public float ZoomLevel {
get { return _zoomLevel; }
set {
_zoomLevel = value;
RaisePropertyChanged(() => ZoomLevel);
}
}
在MyMapFragment中,我有属性Center和ZoomLevel,它们看起来很像:
private LatLng _center;
public LatLng Center{
get { return _center; }
set {
_center = value;
var center = CameraUpdateFactory.NewLatLngZoom(value, ZoomLevel);
Map.MoveCamera(center);
}
}
private float _zoomLevel;
public float ZoomLevel{
get { return _zoomLevel; }
set {
_zoomLevel = value;
var zoom = CameraUpdateFactory.NewLatLngZoom(Center, value);
Map.MoveCamera(zoom);
}
}
在CreateBinding()方法中,我有:
var set = this.CreateBindingSet<MyMapFragment, CityGuideMapViewModel>();
set.Bind(this).For(v => v.Center).To(vm => vm.Center).WithConversion(new LocationToLatLngValueConverter(), null);
set.Bind(this).For(v => v.ZoomLevel).To(vm => vm.ZoomLevel);
set.Apply();
我缺什么了吗?非常感谢!
我缺什么了吗?
当用户更改缩放级别时,您当前没有通知MvvmCross。
您需要在MyMapFragment
中包含一些检测并发出地图缩放级别变化信号的代码,例如,您需要使用OnCameraChangeListener
并触发ZoomLevelChanged事件:
public event EventHandler ZoomLevelChanged;
private float _zoomLevel;
public float ZoomLevel{
get { return _zoomLevel; }
set {
_zoomLevel = value;
var zoom = CameraUpdateFactory.NewLatLngZoom(Center, value);
Map.MoveCamera(zoom);
}
}