I using a Xamarin Forms ListView and I want to enable or disable the Context Actions based on a certain binding or in the code behind.
The way I found is to use BindingContextChanged in a ViewCell. I show you an example
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="https://xamarin.com/schemas/2014/forms" xmlns:x="https://schemas.microsoft.com/winfx/2009/xaml"> <ContentPage.Content> <StackLayout> <ListView x:Name="listDictionaries" ItemsSource="{Binding DictionariesList}" IsVisible="{Binding ShowList}" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" HasUnevenRows="true" IsPullToRefreshEnabled="true" RefreshCommand="{Binding Refresh}" SeparatorVisibility="Default" ItemTapped="OnItemTapped" IsRefreshing="{Binding IsBusy, Mode=OneWay}"> <ListView.ItemTemplate> <DataTemplate> <ViewCell BindingContextChanged="OnBindingContextChanged"> <ViewCell.View> <StackLayout> <Grid Padding="10" ColumnSpacing="10"> <Grid.RowDefinitions> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Label Text="{Binding Name}" FontSize="Large" Grid.Row="0" Grid.Column="0" /> <Label Text="{Binding Description}" FontSize="Small" Grid.Row="1" Grid.Column="0" /> </Grid> </StackLayout> </ViewCell.View> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> </StackLayout> </ContentPage.Content> </ContentPage>
Then you insert in the code the following code:
/// <summary> /// Called when binding context changed. /// </summary> /// <param name="sender">The sender.</param> /// <param name="e">The <see cref="EventArgs"/> /// instance containing the event data.</param> private void OnBindingContextChanged(object sender, EventArgs e) { base.OnBindingContextChanged(); if (BindingContext == null) return; ViewCell theViewCell = ((ViewCell)sender); var item = theViewCell.BindingContext as DictionaryModel; theViewCell.ContextActions.Clear(); if (item != null) { MenuItem mn = new MenuItem(); mn.Clicked += Menu_Clicked; mn.Text = "Delete"; mn.IsDestructive = true; mn.CommandParameter = item.Id; theViewCell.ContextActions.Add(mn); } } private async void Menu_Clicked(object sender, EventArgs e) { var mi = ((MenuItem)sender); }
Happy coding!