MAUI中RelayCommand传递Order对象参数类型不匹配问题求助
问题现象
在MAUI项目中尝试通过XAML和RelayCommand将Order对象传递给Continue方法时,输入文本后运行抛出错误:
System.ArgumentException: 'Parameter "parameter" (object) cannot be of type Pension.ViewsModels.MainViewModel, as the command type requires an argument of type Pension.Models.Order. (Parameter 'parameter')'
已在内部VerticalStackLayout设置x:DataType="model:Order",并通过CommandParameter="{Binding .}"尝试传递Order对象,但错误仍发生在MainPage的BindingContext赋值处。
问题原因
虽然给内部VerticalStackLayout指定了x:DataType="model:Order",但该布局的BindingContext并未指向Order实例,它默认继承自父级的MainViewModel。因此CommandParameter="{Binding .}"实际传递的是MainViewModel对象,和Continue方法要求的Order类型不匹配,导致参数错误。
解决方案
步骤1:在ViewModel中添加Order属性
在MainViewModel中声明一个Order类型的属性,用于承载用户输入的订单数据:
using Pension.Models; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; namespace Pension.ViewsModels { public partial class MainViewModel : ObservableObject { // 声明Order属性,自动生成通知逻辑 [ObservableProperty] private Order _currentOrder = new Order(); [RelayCommand] async Task Continue(Order order) { await Shell.Current.GoToAsync(nameof(ShowOrderPage), true, new Dictionary<string, object> { {"Order", order} }); } } }
步骤2:修改XAML绑定上下文
将内部VerticalStackLayout的BindingContext绑定到ViewModel的CurrentOrder属性,确保该布局下的控件都指向Order实例:
<VerticalStackLayout Spacing="10" BindingContext="{Binding CurrentOrder}" x:DataType="model:Order"> <!-- 原有Label、DatePicker、Entry、Button等控件内容保持不变 --> </VerticalStackLayout>
可选方案:直接指定CommandParameter的绑定路径
如果不想修改VerticalStackLayout的BindingContext,也可以直接在Button的CommandParameter中指定绑定到ViewModel的Order属性:
<Button Text="המשך" BackgroundColor="#EEBF3E" TextColor="Black" CornerRadius="0" Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:MainViewModel}},Path=ContinueCommand}" CommandParameter="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:MainViewModel}}, Path=CurrentOrder}"> <!-- 阴影设置保持不变 --> </Button>
验证效果
完成上述修改后,用户在DatePicker、Entry中输入的数据会正确绑定到CurrentOrder实例,点击按钮时,ContinueCommand会接收到正确的Order对象,不再抛出类型不匹配的错误,可正常跳转到ShowOrderPage并传递订单数据。
内容的提问来源于stack exchange,提问作者Matan Fadida

