You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从转换器返回对象或多值,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:36:02