我可以禁用ViewCell吗?基于条件的ContextActions

本文关键字:条件 ContextActions 于条件 ViewCell 我可以 | 更新日期: 2023-09-27 17:53:03

您好,我使用Xamarin Forms ListView,我想知道我是否可以基于某个绑定或在后面的代码中禁用上下文动作。

我使用一个GroupedListView为整个应用程序,但它显示不同的数据基于什么用户正在做的。有一个"管理你的收藏夹"功能,我希望用户能够在iOS上滑动删除或在android上长按删除列表项,但我不希望这个行为,如果列表显示一些搜索结果或其他东西

<ViewCell.ContextActions>
    <MenuItem Text="Delete" IsDestructive="true" CommandParameter="{Binding .}" Command="{Binding Path=BindingContext.OnDeleteCommand, Source={x:Reference Name=ListViewPage}}"/>
</ViewCell.ContextActions>

这没有禁用它…

<ViewCell.ContextActions IsEnabled="false"> //This IsEnabled does nothing
    <MenuItem Text="Delete" IsDestructive="true" CommandParameter="{Binding .}" Command="{Binding Path=BindingContext.OnDeleteCommand, Source={x:Reference Name=ListViewPage}}"/>
</ViewCell.ContextActions>

如何禁用ContextActions?我不希望用户总是能够滑动

我可以禁用ViewCell吗?基于条件的ContextActions

对于我想要实现的目标,我做了以下操作…

在XAML 中
<ViewCell BindingContextChanged="OnBindingContextChanged">

后面的代码
private void OnBindingContextChanged(object sender, EventArgs e)
{
    base.OnBindingContextChanged();
    if (BindingContext == null)
        return;
    ViewCell theViewCell = ((ViewCell)sender);
    var item = theViewCell.BindingContext as ListItemModel;
    theViewCell.ContextActions.Clear();
    if (item != null)
    {
        if (item.ListItemType == ListItemTypeEnum.FavoritePlaces
           || item.ListItemType == ListItemTypeEnum.FavoritePeople)
        {
            theViewCell.ContextActions.Add(new MenuItem()
            {
                Text = "Delete"
            });
        }
    }
}

根据我们正在处理的列表项的类型,我们可以决定在哪里放置上下文动作

有几种方法可以做到这一点。

  1. 您可以根据需要将MenuItemContextActions中移除。这不能通过纯XAML完成,您将不得不做一些代码隐藏。
  2. 另一个选择是看DataTemplateSelector。这允许你在运行时为你的ViewCell(或Cells)选择一个模板。在该模板中,您可以选择是否添加ContextActions

简单地禁用手机可以工作,但Android只适用于iOS。在iOS和Android上使用Xamarin Forms(2.0.5782)项目进行测试。

<ViewCell IsEnabled="false">

注意它在ViewCell上而不是ViewCell上。