CollectionView 项中的 Maui Picker,无法将 SelectedIndexChanged 绑定到集合项对象

问题描述 投票:0回答:1

我在 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);
    }
}
maui picker collectionview selectedindexchanged
1个回答
0
投票

对于将选择器更改信息获取到 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

© www.soinside.com 2019 - 2024. All rights reserved.