Xamarin.Forms - Связывание с ContextMenu - PullRequest
1 голос
/ 20 апреля 2020

У меня есть список с песнями в качестве предметов. Длительное нажатие на элемент должно отобразить контекстное меню.

AllSongsViewModel.xaml:

<DataTemplate x:Key="SongTemplate">
    <ViewCell>
        <ViewCell.ContextActions>
            <MenuItem Text="Edit" />
            <MenuItem Text="Delete"/>
        </ViewCell.ContextActions>

        <StackLayout Padding="15,5" VerticalOptions="Center">

            <Label Text="{Binding Title}"
                   FontSize="16"/>
            <Label Text="{Binding Performer}"
                   FontSize="12"/>
        </StackLayout>
    </ViewCell>
</DataTemplate>

Это работает хорошо, но мне нужно привязать сейчас, чтобы контекстное меню открылось в зависимости от bool IsAdmin, который лежит в AllSongsViewModel

AllSongsViewModel.cs:

public bool IsAdmin => _authService.LoggedUser.Role == "Admin";

Но я не знаю, как связать это свойство с контекстным меню

1 Ответ

1 голос
/ 20 апреля 2020

К сожалению, вы не можете сделать это на ViewModel. Но вы можете установить событие BindingContextChange в своей ячейке просмотра и изменить его там следующим образом:

XAML:

<DataTemplate x:Key="SongTemplate">
 <ViewCell BindingContextChanged="OnBindingContextChanged">
    <StackLayout Padding="15,5" VerticalOptions="Center">

        <Label Text="{Binding Title}"
               FontSize="16"/>
        <Label Text="{Binding Performer}"
               FontSize="12"/>
    </StackLayout>
</ViewCell>

В вашем коде:

 private void OnBindingContextChanged(object sender, EventArgs e)
    {
        base.OnBindingContextChanged();

        if (BindingContext == null)
            return;

        ViewCell theViewCell = ((ViewCell)sender);
        var viewModel = this.BindingContext.DataContext as AllSongsViewModel;
        theViewCell.ContextActions.Clear();

        if (viewModel.IsAdmin)
        {
            theViewCell.ContextActions.Add(new MenuItem()
            {
                Text = "Delete",
            });

            theViewCell.ContextActions.Add(new MenuItem()
            {
                Text = "Edit",
            });
        }
    }
...