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

如何在Xamarin中使用FreshMvvm绑定SwipeItem实现列表项删除

解决Xamarin FreshMvvm中ListView的SwipeView命令绑定问题

1. 修正XAML中的SwipeView绑定

在ListView的DataTemplate里,SwipeItem的命令需要绑定到页面的ViewModel(而非当前列表项的上下文),参数绑定当前项的目标值。首先给页面根元素设置x:Name,然后通过x:Reference指定绑定源:

<!-- 页面根元素设置x:Name -->
<ContentPage x:Name="StockIncomePage" 
             xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="YourNamespace.StockIncomePage">
    <ListView ItemsSource="{Binding Products}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <SwipeView>
                    <!-- 右滑菜单 -->
                    <SwipeView.RightItems>
                        <SwipeItems>
                            <SwipeItem Text="删除" 
                                       Command="{Binding BindingContext.ProductDeleted, Source={x:Reference StockIncomePage}}"
                                       CommandParameter="{Binding ProductNo}"/>
                        </SwipeItems>
                    </SwipeView.RightItems>
                    <!-- 列表项内容 -->
                    <ViewCell>
                        <StackLayout Padding="10">
                            <Label Text="{Binding ProductName}" FontSize="Medium"/>
                            <Label Text="{Binding ProductNo}" FontSize="Small" TextColor="Gray"/>
                        </StackLayout>
                    </ViewCell>
                </SwipeView>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>

如果想直接传递整个列表项对象,把CommandParameter改成{Binding}即可,后续处理更简单。

2. 修正ViewModel中的命令定义

在StockIncomePageModel中,用FreshMvvm的FreshICommand正确初始化命令,并确保参数能被正确接收处理:

using FreshMvvm;
using System.Collections.ObjectModel;
using System.Windows.Input;
using System.Linq;

namespace YourNamespace
{
    public class StockIncomePageModel : FreshBasePageModel
    {
        // 绑定到ListView的数据源
        public ObservableCollection<Product> Products { get; set; }

        // 删除命令
        public ICommand ProductDeleted { get; }

        public StockIncomePageModel()
        {
            Products = new ObservableCollection<Product>();
            // 关联命令执行方法
            ProductDeleted = new FreshICommand(ItemDeleted);
        }

        // 命令执行方法
        private void ItemDeleted(object parameter)
        {
            // 情况1:传递的是ProductNo字符串
            if (parameter is string productNo)
            {
                var targetProduct = Products.FirstOrDefault(p => p.ProductNo == productNo);
                if (targetProduct != null)
                {
                    Products.Remove(targetProduct);
                }
            }

            // 情况2:传递的是整个Product对象(对应CommandParameter="{Binding}")
            // if (parameter is Product targetProduct)
            // {
            //     Products.Remove(targetProduct);
            // }
        }
    }

    // 示例Product模型
    public class Product
    {
        public string ProductName { get; set; }
        public string ProductNo { get; set; }
    }
}

3. 关键排查点

  • 确认页面的BindingContext已正确设置为StockIncomePageModel(FreshMvvm默认会自动绑定,若手动修改过需检查)。
  • 检查x:Reference的名称和页面根元素的x:Name完全一致,大小写敏感。
  • 确保Product模型中的ProductNo是public属性,否则绑定无法读取。
  • 若命令仍无响应,可在ItemDeleted方法中加断点,确认是否触发;也可通过Xamarin Inspector检查绑定是否有错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 19:02:54