Xamarin.Forms ChangeCanExecute не использует правильные параметры

У меня есть приложение Xamarin.Forms, работающее в UWP, где я использую DLToolkit.Forms.Controls.FlowListView (из daniel-luberda) для отображения своего рода сетки с помощью кнопок.

Используемая среда Mvvm - FreshMvvm.

Вот мой обзор сетки в XAML:

<c:FlowListView SeparatorVisibility="None" 
    HasUnevenRows="False" FlowColumnMinWidth="100" 
    FlowItemsSource="{Binding Boards}">
    <c:FlowListView.FlowColumnTemplate>
        <DataTemplate>
            <Button  Text="{Binding Number}" 
                Command="{Binding Path=BindingContext.SelectBoardCommand, Source={x:Reference Name=SalesPage}}" 
                CommandParameter="{Binding .}" />
        </DataTemplate>
    </c:FlowListView.FlowColumnTemplate>
</c:FlowListView>

Вот результат (я упростил XAML относительно цвета и размера):

Вид сетки

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

И моя команда выглядит так:

    private ICommand _selectBoardCommand;

    [DoNotNotify]
    public ICommand SelectBoardCommand => _selectBoardCommand = new Command<BoardModel>(board =>
    {
        board.NotUsed = false;
        ((Command<BoardModel>) _selectBoardCommand).ChangeCanExecute();
    }, board => board != null && board.NotUsed);

Нажатие на кнопку вызывает команду с правильным параметром (номер доски, связанный с текстом команды, - это тот, который я получаю в команде). Но при вызове CanChangeExecute для отключения команды я не могу передать выбранную доску в качестве аргумента.

И в команде, при использовании

((Command<BoardModel>) _selectBoardCommand).ChangeCanExecute();

это вызывает Func

board => board != null && board.NotUsed

с последним пунктом списка.

Более того, мне нужно было поместить "board!= Null" в ChangeCanExecute, потому что этот Func часто вызывается с нулевыми значениями.

Любая идея?

1 ответ

Решение

Я вижу два выхода из вашей проблемы:
1) Переместить SelectBoardCommand внутри BoardModel, Это не будет нуждаться в параметре и будет работать на каждой модели индивидуально;
2) Bind Enabled собственностью Button в NotUsed имущество. В этом случае пользователь не сможет позвонить SelectBoardCommand из интерфейса вообще.

Другие вопросы по тегам