如何从转换器返回对象或多值,将Xamarin地图点击经纬度传回ViewModel
问题根因
你当前的转换器只返回了纬度单个值,自然无法同时将经纬度两个参数传递到ViewModel。
解决方案
直接在转换器中返回包含完整经纬度信息的Position结构体即可,无需拆分后单独返回,具体实现如下:
1. 修改转换器逻辑
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var mapClickedEventArgs = value as Xamarin.Forms.Maps.MapClickedEventArgs; if (mapClickedEventArgs == null) return null; // 直接返回包含经纬度的Position对象 return mapClickedEventArgs.Position; }
2. 配置XAML事件绑定
确保你使用EventToCommand行为绑定事件时,正确引用了上述转换器:
<ContentPage.Resources> <!-- 注册转换器,这里的local替换为你转换器所在的命名空间 --> <local:MapClickPositionConverter x:Key="MapClickPositionConverter" /> </ContentPage.Resources> <maps:Map> <maps:Map.Behaviors> <toolkit:EventToCommandBehavior EventName="MapClicked" Command="{Binding MapTapCommand}" Converter="{StaticResource MapClickPositionConverter}" /> </maps:Map.Behaviors> </maps:Map>
3. ViewModel中接收参数
直接用Position作为Command的参数类型即可拿到完整经纬度:
using Xamarin.Forms.Maps; using System.Windows.Input; public class YourViewModel : INotifyPropertyChanged { public ICommand MapTapCommand { get; } public YourViewModel() { MapTapCommand = new Command<Position>(HandleMapClick); } private void HandleMapClick(Position clickedPosition) { double lat = clickedPosition.Latitude; double lng = clickedPosition.Longitude; // 执行你的业务逻辑 } // 其他ViewModel逻辑省略 }
可选方案
如果你不想引用Xamarin.Forms.Maps命名空间到ViewModel层,可以在转换器中返回自定义的经纬度数据类或者值元组,只要和ViewModel中Command的参数类型对应即可。
内容的提问来源于stack exchange,提问作者Paul Gordon
相关产品推荐
相关产品推荐

