我可以根据条件禁用ViewCell.ContextActions吗?

时间:2016-06-29 15:43:41

标签: c# xaml listview xamarin xamarin.forms

您好我使用的是Xamarin Forms ListView,我想知道是否可以根据某个绑定或后面的代码禁用Context Actions。

我在整个应用程序中使用一个GroupedListView,但它根据用户的操作显示不同的数据。有一个“管理您的收藏夹”功能,我希望用户能够在iOS上滑动删除或长按Android以删除ListItem,但如果列表显示一些搜索,我不希望这种行为结果或其他东西

<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?我不希望用户总是能够刷卡

4 个答案:

答案 0 :(得分:7)

对于我想要实现的目标,我做了以下......

在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 :(得分:4)

有几种方法可以解决这个问题。

  1. 您可以根据条件从MenuItem删除ContextActions。纯XAML无法做到这一点,您将不得不做一些代码隐藏。
  2. 另一个选择是查看DataTemplateSelector。这使您可以在运行时为ViewCell(或单元格)选择模板。在该模板中,您可以选择是否添加ContextActions

答案 2 :(得分:-1)

您可以使用函数OnBindingContextChanged

在您的xaml中,您应该在viewCell标记中添加BindingContextChanged

<DataTemplate>
       <ViewCell BindingContextChanged="OnBindingContextChanged">
          <ViewCell.ContextActions>

然后在您的代码后面创建此功能:

protected  void OnBindingContextChanged(object sender, EventArgs e)
        {
           base.OnBindingContextChanged();
           ViewCell ContextActions = ((ViewCell)sender);
           ViewCell theViewCell = ((ViewCell)sender);
           var item = theViewCell.BindingContext as Category;
           ContextActions.ContextActions.Clear();

           var deleteAction = new MenuItem { Text = "text", IsDestructive = true }; 
           //you can use your commands from ViewModel
           deleteAction.SetBinding(MenuItem.CommandParameterProperty, new Binding("."));
           deleteAction.SetBinding(MenuItem.CommandProperty, new Binding("BindingContext.MyCommand", source: Categories));
           ContextActions.ContextActions.Add(deleteAction);

        }

答案 3 :(得分:-2)

简单地禁用该单元格,但仅适用于Android而不是iOS。在iOS和Android上使用Xamarin Forms(2.0.5782)项目进行测试。

<ViewCell IsEnabled="false">

请注意,它位于ViewCell上,而不是您样本中的ViewCell.ContextActions。