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

MAUI MVVM中实现ListView点击项触发命令并获取数据

MAUI MVVM下ListView点击项触发命令并获取对象的正确实现

方法一:使用EventToCommandBehavior(推荐)

MAUI内置EventToCommandBehavior,可将ListView的ItemTapped事件绑定到ViewModel的RelayCommand,同时传递点击的对象。

1. 修改XAML代码

先添加行为命名空间,再给ListView绑定事件转命令的行为:

<!-- 添加行为命名空间 -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:behaviors="clr-namespace:Microsoft.Maui.Controls.Behaviors;assembly=Microsoft.Maui.Controls"
             xmlns:local="clr-namespace:你的项目命名空间"
             x:Class="你的项目命名空间.Inventario">

    <ContentPage.Resources>
        <!-- 注册事件参数转换器 -->
        <local:ItemTappedEventArgsConverter x:Key="ItemTappedEventArgsConverter" />
    </ContentPage.Resources>

    <ListView ItemsSource="{Binding Productos}" 
              HasUnevenRows="True" 
              SelectedItem="{Binding SelectedItem}" 
              IsPullToRefreshEnabled="True" 
              RefreshCommand="{Binding RefreshCommand}" 
              IsRefreshing="{Binding IsRefreshLoading}">
        <ListView.Behaviors>
            <behaviors:EventToCommandBehavior
                EventName="ItemTapped"
                Command="{Binding ItemTappedCommand}"
                EventArgsConverter="{StaticResource ItemTappedEventArgsConverter}" />
        </ListView.Behaviors>
        <ListView.ItemTemplate>
            <!-- 你的ItemTemplate内容 -->
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>

2. 添加事件参数转换器

新建转换器类,将ItemTappedEventArgs转为Productos对象:

public class ItemTappedEventArgsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is ItemTappedEventArgs args)
        {
            return args.Item as Productos;
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

3. 更新ViewModel的RelayCommand

修改命令,让它接收Productos类型参数:

[RelayCommand]
void ItemTapped(Productos producto)
{
    if (producto == null) return;
    // 处理点击逻辑,producto就是被点击的对象
    // 示例:Console.WriteLine($"点击产品:{producto.ProductName}");
}

方法二:利用SelectedItem属性变更

因为你已绑定SelectedItem到ViewModel,可直接监听该属性的变化处理点击:

1. 在ViewModel中添加属性变更逻辑

借助CommunityToolkit.Mvvm自动生成的OnSelectedItemChanged方法:

public partial class InventarioViewModel : ObservableObject
{
    // 原有代码保持不变

    partial void OnSelectedItemChanged(Productos oldValue, Productos newValue)
    {
        if (newValue == null) return;
        // 处理点击逻辑,newValue就是被点击的对象
        // 示例:Console.WriteLine($"选中产品:{newValue.ProductName}");
        
        // 可选:点击后取消选中状态,避免重复触发
        SelectedItem = null;
    }
}

2. XAML无需额外修改

保持原有的SelectedItem="{Binding SelectedItem}"配置即可,点击项时会自动触发属性变更方法。

你之前写法失效的原因

  • ItemTapped是事件,不是可绑定的命令属性,不能直接用{Binding ...}绑定,必须通过行为转换为命令。
  • MAUI的ListView不存在ItemTappedCommand属性,所以直接写该属性会报XAML错误。
  • 原RelayCommand未定义参数,即使触发也无法获取点击的对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:45:35