Вызов метода из ViewModel вызывает System.NullReferenceException

#xamarin #xamarin.forms #mvvm #cross-platform #nullreferenceexception

#xamarin #xamarin.forms #mvvm #кроссплатформенный #nullreferenceexception

Вопрос:

Я новичок в Xamarin.Формы, и я разрабатываю приложение для кроссплатформенности. В приложении пользователям необходимо войти в Facebook и Twitter, чтобы принять участие в каком-то конкретном событии. Поэтому я установил статическую функцию входа в систему на странице настроек и присоединился к странице событий. Мне нужно проверить, был ли вход в систему успешным, и показывать имя пользователя на странице каждый раз, когда пользователь открывает страницу настроек. поэтому я решил вызвать метод проверки в коде, в методе OnAppearing . Но это вызвало бы NullReferenceException . если бы я просто переместил весь код из метода проверки, на странице настроек ничего не изменилось.

Вот мой код:

     public SettingAct()
    {
        InitializeComponent();
    }

    protected override void OnAppearing()
    {
        (BindingContext as SettingViewModel).CekLogin();
    }
 

Метод проверки в моей ViewModel:

     internal void CekLogin()
    {
        Console.WriteLine("LoginCheck");
        if (SessionManager.FacebookLogin())
        {
            FacebookName = SessionManager.FacebookName();
            FbImage = "fb_sett_active.png";
            Console.WriteLine("Facebook logged in");
        }
        else
        {
            FacebookName = "Facebook";
            FbImage = "fb_sett.png";
            Console.WriteLine("Facebook not logged in");
        }

        if (SessionManager.TwitterLogin())
        {
            TwitterName = SessionManager.TwitterName();
            TwitImage = "twitter_sett_active.png";
            Console.WriteLine("Twitter logged in");
        }
        else
        {
            TwitterName = "Twitter";
            TwitImage = "twitter_sett.png";
            Console.WriteLine("Twitter not logged in");
        }
    }
 

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

    (BindingContext as MainViewModel).RefreshKuliahLogPoint();
 

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

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

1. Вы установили код BindingContext in или xaml?

2. в моем xaml тег ContentPage.BindingContext .

3. Не могли бы вы поделиться образцом с github, чтобы я мог протестировать его на своей стороне

Ответ №1:

Свойство BindingContext будет возвращать значение null, пока вы на самом деле не установите для него значение something .

 public SettingAct()
{
    InitializeComponent();
    BindingContext = new SettingViewModel();
}

protected override void OnAppearing()
{
    (BindingContext as SettingViewModel).CekLogin();
}
 

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

1. Я установил BindingContext в моем файле XAML. это нехорошо? Кстати, в вашем коде есть две точки с запятой. Редактировать: после реализации вашего предложения я все равно получил исключение NullReferenceException (ОШИБКА: пойманное исключение в OnAfterSave на 290), но мой код все равно работает. это нормально?