您好我使用的是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?我不希望用户总是能够刷卡
答案 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)
有几种方法可以解决这个问题。
MenuItem
删除ContextActions
。纯XAML无法做到这一点,您将不得不做一些代码隐藏。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。