Формы Xamarin не могут назначить команду пользовательской кнопке

#c# #xamarin #xamarin.forms #xamarin.android #xamarin.ios

#c# #xamarin #xamarin.forms #xamarin.android #xamarin.ios

Вопрос:

У меня проблема. Я использую следующий код: https://github.com/Polarts/CrossFAB

В page1.xaml я добавил FabMenu следующим образом:

 <c:FloatingMenu Margin="0, 0, 10, 10" BGColor="#56D7A5" OpenIcon="openFab_icon" CloseIcon="closeFab_icon"
                AbsoluteLayout.LayoutBounds=".95,.95" AbsoluteLayout.LayoutFlags="PositionProportional">
    <c:FloatingButton x:Name="btnAddItem" BGColor="#59E1FF" IconSrc="add_item_icon" BindingContext="{x:Reference ItemPage}" OnClickCommand="{Binding btnAddItemCommand}" />
</c:FloatingMenu>
  

И в page1.xaml.cs я добавил команду следующим образом:

 public partial class Page1 : ContentPage
{

    public static ICommand btnAddItemCommand { get; set; }

    public Page1 ()
    {
        InitializeComponent();
            
        btnAddItemCommand = new Command(OpenNewItemPage);
    }

    private async void OpenNewItemPage()
    {
        await Application.Current.MainPage.Navigation.PushAsync(new NewItemPage());
    }
}
  

Проблема в том, что когда я нажимаю кнопку, она выдает ошибку в FloatingButton.xaml.cs строке: OnClickCommand.Execute(null); .
Ошибка:

Ссылка на объект не установлена для экземпляра объекта

Это связано с тем, что в соответствии с моим кодом OnClickCommand не установлен экземпляр, поэтому имеет значение null. Код FloatingButton.xaml.cs можно найти здесь: https://github.com/Polarts/CrossFAB/blob/master/CrossFAB/Controls/FloatingButton.xaml.cs

Как я могу это исправить?

Комментарии:

1. что показывает трассировка стека? Какой элемент на самом деле равен нулю?

2. В трассировке стека я вижу только это: 0x8 in MyApp.FabMenu.FloatingButton.<OnPropertyChanged>b__18_0 at C:UsersmesourcereposMyAppMyAppMyAppFabMenuFloatingButton.xaml.cs:94,21 что это значит?

3. исключение возникает в строке 94 FloatingButton.xaml.cs

4. Затем я снова в этой строке: OnClickCommand.Execute(null); , но я не знаю, почему это выдает мне ошибку?

5. это опечатка в вашем конструкторе? btnAddHomeworkCommand

Ответ №1:

Я думаю, что вы не связываете команду успешно.

В .cs установите BindingContext = this; и не определяйте btnAddItemCommand как статическое свойство:

 public partial class MainPage : ContentPage
{
    public ICommand btnAddItemCommand { get; set; }

    public MainPage()
    {
        InitializeComponent();

        btnAddItemCommand = new Command(OpenNewItemPage);

        BindingContext = this;
    }
    private void OpenNewItemPage()
    {
        Console.WriteLine("OpenNewItemPage");
    }
}
  

В xaml удалите часть BindingContext:

 <StackLayout>
    <!-- Place new controls here -->
    <Button x:Name="btnAddItem" Text="test" Command="{Binding btnAddItemCommand}" />

</StackLayout>