我在 DataTemplate 内的网格中有购物车项目,用于显示 CollectionView 项目。 在购物车中,我有“添加/删除”按钮,其中的命令路由到 CartViewModel 并传递它们所属的 CartViewItem 的 CommandParameter。
现在我需要对定价类型下拉菜单的选择器执行相同的操作 我不知道如何将选择器 PropertyChanged 路由到模型并传递哪个项目的选择器已更改。
获取有关 PropertyChanged 事件所指的购物车商品的信息的最佳方式是什么? 此代码只是将命令发送到 CartPage 内容页面,没有有关它属于哪个购物车项目的信息。
<Picker Grid.Row="3"
SelectedIndexChanged="Picker_SelectedIndexChanged"
ItemsSource="{Binding CostTypeList}"
SelectedItem="{Binding CostType}"
/>
<Button Text="ADD"
Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:CartViewModel}},Path=AddCommand}"
CommandParameter="{Binding .}"
Grid.Row="4" BackgroundColor="Blue"></Button>
<Button Text="REMOVE"
Command="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:CartViewModel}},Path=RemoveCommand}"
CommandParameter="{Binding .}" Grid.Row="4" Grid.Column="1" BackgroundColor="DarkRed"></Button>
我无法使用类似于按钮语法的语法。
<Picker Grid.Row="3"
SelectedIndexChanged="{Binding Source={RelativeSource AncestorType={x:Type viewmodel:CartViewModel}},Path=Picker_SelectedIndexChanged}"
ItemsSource="{Binding CostTypeList}"
SelectedItem="{Binding CostType}"
/>
在构建之前出现此错误
XFC0000 无法解析类型“clr-namespace:SVCA_Android.ViewModels:CartViewItem”。 登录-maui (net8.0-android34.0)
构建后出现此错误
错误(活动)XFC0009 未找到“SelectedIndexChanged”的属性、BindableProperty 或事件,或者值和属性之间的类型不匹配。 登录-maui (net8.0-android34.0)
public partial class CartViewModel : ObservableObject
{
[ObservableProperty]
ObservableCollection<CartViewItem> items;
[ObservableProperty]
public string costType;
[ObservableProperty]
public List<string> costTypeList;
public partial class CartViewItem : ObservableObject
{
[ObservableProperty]
public string costType;
[ObservableProperty]
public List<string> costTypeList;
}
public void Picker_SelectedIndexChanged(object sender, EventArgs e)
{
}
[RelayCommand]
async Task Add(CartViewItem i)
{
System.Diagnostics.Debug.WriteLine(i.ItemName + " " + i.ItemQty);
}
[RelayCommand]
async Task Remove(CartViewItem i)
{
System.Diagnostics.Debug.WriteLine(i.ItemName + " " + i.ItemQty);
}
}
对于将选择器更改信息获取到 CollectionViews 项的情况,使用 Picker_SelectedIndexChanged 是错误的方法。
使用 MVVM 社区工具包的正确方法是使用该工具包生成的 OberservableProperty 观察器。 请注意,您需要像这样使用 ObservableProperty 的大写
public partial class CartViewItem : ObservableObject
{
[ObservableProperty]
public string costType;
[ObservableProperty]
public List<string> costTypeList;
partial void OnCostTypeChanged(string value)
{
System.Diagnostics.Debug.WriteLine(value);
}
使用xaml
<Picker Grid.Row="3"
ItemsSource="{Binding CostTypeList}"
SelectedItem="{Binding CostType}"
/>
还要注意,至少在 Android 上,观察者将在每个购物车项目的初始化时触发一次。
参考 使用 CommunityToolkit.MVVM 将参数从 ViewModel 传递到 .NET MAUI 中的 ViewModel