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

.NET MAUI自定义控件中Bindable Command始终为空的问题

解决.NET MAUI自定义Map控件Bindable Command为null的问题

问题根源

自定义控件中可绑定属性的类型错误,直接指定了具体的RelayCommand类型,而MVVM Toolkit生成的命令虽为RelayCommand实例,但绑定系统需要基于ICommand接口进行匹配,导致绑定失败,最终OnSelectedPin始终为null。

修正步骤

1. 修改CustomMap的可绑定属性类型

将可绑定属性的类型从RelayCommand改为ICommand,这是所有命令的通用接口,能兼容任何实现ICommand的命令类型(包括RelayCommand):

public partial class CustomMap : Map
{
    ...

    public static readonly BindableProperty OnSelectedPinProperty =
        BindableProperty.Create(
            nameof(OnSelectedPin),
            typeof(ICommand), // 改为ICommand接口
            typeof(CustomMap));

    public ICommand OnSelectedPin // 属性类型同步改为ICommand
    {
        get { return (ICommand)GetValue(OnSelectedPinProperty); }
        set { SetValue(OnSelectedPinProperty, value); }
    }

    ...

    private void Pin_Clicked(object sender, PinClickedEventArgs e)
    {
        if (OnSelectedPin?.CanExecute(null) ?? false)
        {
            OnSelectedPin.Execute(null);
        }
    }
}

2. 确认ViewModel与XAML绑定匹配

ViewModel中[RelayCommand]标签会自动生成后缀为Command的属性,你当前XAML中OnSelectedPin="{Binding OnSelectedPinCommand}"的绑定是正确的,无需修改这部分。

3. 可选:添加绑定变更回调(用于调试)

如果仍有问题,可在可绑定属性中添加变更回调,验证绑定是否生效:

public static readonly BindableProperty OnSelectedPinProperty =
    BindableProperty.Create(
        nameof(OnSelectedPin),
        typeof(ICommand),
        typeof(CustomMap),
        propertyChanged: OnSelectedPinChanged);

private static void OnSelectedPinChanged(BindableObject bindable, object oldValue, object newValue)
{
    // 调试时可在此查看newValue是否为有效命令实例
}

验证

修改后重新运行项目,点击Pin时,OnSelectedPin将正确获取ViewModel中的OnSelectedPinCommand,并触发ViewModel的OnSelectedPin方法。

内容的提问来源于stack exchange,提问作者Cliffhanger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:30:20