Команда Xamarin Forms всегда имеет значение null в настраиваемом элементе управления - PullRequest
0 голосов
/ 09 мая 2020

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

Я пытаюсь передать привязанную команду с моей страницы к моему элементу управления

Моя XAML PAge:

                <sharedviews:ButtonLoader TextLabel="{extensions:Translate Save}"   BackgroundColorButton="{StaticResource RedColor}" HeightRequest="50" HorizontalOptions="Center" Animation="Cupertino" TextColorIndicator="White" 
                                          TextColorLabel="White"  VerticalOptions="End" Command="{Binding ValidateMandatoryCommand}" TextWaiting="{extensions:Translate Saving...}" />

                <Button HeightRequest="50" WidthRequest="150" VerticalOptions="End" Margin="0,10,0,0"  HorizontalOptions="Center"
                    Style="{StaticResource ValidButtonStyle}" FontSize="15" Padding="5"
                    Text="{extensions:Translate Next}"
                            Command="{Binding ValidateMandatoryCommand}" />

Когда я использую команду ValidateMandatoryCommand в стандартной кнопке, она работает хорошо. Когда я использую его в своей пользовательской кнопке (sharedviews: ButtonLoader), он всегда равен нулю. Это подтверждает, что моя команда ValidateMandatoryCommand работает хорошо.

Мой XAML моей настраиваемой кнопки выглядит так:

 <ContentView.Content>
    <Grid>
        <buttons:SfButton x:Name="btn" Clicked="btn_Clicked" CornerRadius="30" HorizontalOptions="Center" VerticalOptions="Center">
            <buttons:SfButton.Content>
                <StackLayout Orientation="Horizontal" Margin="10">
                    <busyindicator:SfBusyIndicator IsVisible="False" x:Name="busyIndicator" AnimationType="Cupertino" IsBusy="True" TextColor="White" WidthRequest="40" ViewBoxWidth="40"/>
                    <Label x:Name="labelLoader" Text="Loading..." FontSize="15" VerticalTextAlignment="Center" HorizontalOptions="CenterAndExpand" TextColor="White" />
                </StackLayout>
            </buttons:SfButton.Content>
        </buttons:SfButton>
    </Grid>
</ContentView.Content>

Мой C# код загрузчика кнопок для моей команды:


     public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command), typeof(ICommand), typeof(ButtonLoader), default(ICommand), defaultBindingMode: BindingMode.TwoWay);
        public ICommand Command
        {
            get
            {
                return (ICommand)GetValue(CommandProperty);
            }

            set
            {
                SetValue(CommandProperty, value);
            }
        }

     private async void btn_Clicked(object sender, EventArgs e)
        {
            labelLoader.Text = TextWaiting;
            busyIndicator.IsBusy = true;
            busyIndicator.IsVisible = true;

            //if (Command != null) <= //**Always NULL**
            //{
                await Task.Run(() => {
                    Command.Execute(null);
                });

            //}


            busyIndicator.IsVisible = false;
            busyIndicator.IsBusy = false;
            labelLoader.Text = TextLabel;
        }

РЕДАКТИРОВАТЬ на основе комментариев

Моя ValidateMandatoryCommand определяется как:

public ICommand ValidateMandatoryCommand => AsyncCommand.Create(ValidateMandatory);

    private async Task ValidateMandatory()
      {}

И AsyncCommand

   public class AsyncCommand : ICommand
{
    public event EventHandler CanExecuteChanged;

    private readonly ICommand _command;

    protected AsyncCommand(ICommand command)
    {
        _command = command;
        command.CanExecuteChanged += (sender, args) => CanExecuteChanged.InvokeSafely(sender, args);
    }

    public bool CanExecute(object parameter)
    {
        return _command.CanExecute(parameter);
    }

    public void Execute(object parameter)
    {
        _command.Execute(parameter);
    }

    public static AsyncCommand Create(Func<System.Threading.Tasks.Task> func)
    {
        return new AsyncCommand(new Command(async () => await func()));
    }
}

1 Ответ

0 голосов
/ 11 мая 2020

Если вы наследуете свое представление от кнопки, вам необходимо изменить имя своего BindableProperty. У класса Button уже есть свойство с таким же именем.

...