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
из интерфейса вообще.