ICommand Xamarin Forms - PullRequest
       12

ICommand Xamarin Forms

0 голосов
/ 19 мая 2018

У меня странная проблема с получением нулевого исключения.Я создал класс, который реализует интерфейс ICommand, у меня есть два метода.

public void Execute(object parameter)
{
    NavigateAsync();
}

private async void NavigateAsync()
{
    await App.MainNavigation.PushAsync(new Pages.SettingsPage());
}

Когда функция NavigateAsync () работает, моя MainNavigation всегда равна нулю, даже если я вижу, что параметр внутри Execute установлен.

В моем файле App.xaml.cs я создал публичную статическую INavigation MainNavigation {get;задавать;}

public partial class App : Application
    {
        public static ViewModels.MainViewModel ViewModel { get; set; }
        public static INavigation MainNavigation { get; set; }

        public App ()
        {
            InitializeComponent();

            MainPage = new NavigationPage(new Paperboy.MainPage());
        }

        protected override void OnStart ()
        {
            // Handle when your app starts
        }

        protected override void OnSleep ()
        {
            // Handle when your app sleeps
        }

        protected override void OnResume ()
        {
            // Handle when your app resumes
        }
    }

Se при нажатии значка я могу видеть, что команда выполнена, но App.MainNavigation внутри NavigateAsync () в null.Поэтому команда не выполняет PushAsync для SettingsPage.

1 Ответ

0 голосов
/ 20 мая 2018

Вы никогда не создаете экземпляр своего свойства static MainNavigation ... Если я могу дать вам два замечания:

  • вместо использования статического свойства, объявленного в вашем App.xaml.cs, возможно,Лучшая реализация могла бы заключаться в том, чтобы встроить средство получения Navigation в определенный класс 'service' или непосредственно в определение вашей команды:

    public class MyCommand : ICommand
    {
        ...
    
        // Navigation getter
        // There are better places for this prop but it's better
        // than in app.xaml.cs
        private INavigation MainNavigation
        {
            get => Application.Current?.MainPage?.Navigation;
        }
    
        public void Execute(object parameter)
        {
             NavigateAsync();
        }
    
        private async void NavigateAsync()
        {
            try
            {
                await MainNavigation?.PushAsync(new Pages.SettingsPage());
            }
            catch(){ ... }
        }
    }
    
  • Еще один момент, который я хотел бы отметить, заключается в том, что вашКоманда выглядит как асинхронная.Возможно, вы уже знаете, но вот хорошая реализация асинхронных команд, чтобы избежать сбоев приложения: Асинхронные команды

Я надеюсь, что это может помочь вам.Удачного кодирования!

...