.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
相关产品推荐
相关产品推荐

