Xamarin - привязка имени пользователя от входа к панели инструментов

Я стараюсь делать именно то, что написано в названии, я искал, искал и ничего.

Надеюсь, что кто-нибудь может помочь, вот в чем проблема:

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

public async Task<string> LoginAsync(string user, string pass, string company)
    {
        RssUser userInfos = new RssUser{ user = user, pass = pass, company = "PROJECTO_GPS" };
        RootObject ro = new RootObject();
        ro.rssUser = userInfos;

        var jsonObj = JsonConvert.SerializeObject(ro);
        using (HttpClient client = new HttpClient())
        {
            StringContent content = new StringContent(jsonObj.ToString(), Encoding.UTF8, "application/json");
            var request = new HttpRequestMessage()
            {
                RequestUri = new Uri("http://evolus.ddns.net/Q4Evolution/php/phpGps/BOLoginGps.php"),
                Method = HttpMethod.Post,
                Content = content
            };
            var response = await client.SendAsync(request);
            string dataResult = response.Content.ReadAsStringAsync().Result;

            Debug.WriteLine(dataResult);
            return dataResult;
        }
    }

А это класс Rss:

 public class RssUser
    {

        private AppService _log = new AppService();
        public string user { get; set; }
        public string pass { get; set; }
        public string company { get; set; }

        public ICommand LoginCommmand
        {
            get
            {
                return new Command(async () =>
                {
                    await _log.LoginAsync(user, pass, company);

                });
            }
        }

    }

   public class RootObject
     {
    public RssUser rssUser { get; set; }
     }

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

Вот код Xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:viewModels="clr-namespace:AppQ4evo.ViewModels"
         x:Class="AppQ4evo.Menu"
         NavigationPage.HasBackButton="False">
<ContentPage.BindingContext>
    <viewModels:RssUser/>
</ContentPage.BindingContext>

<ContentPage.ToolbarItems>
    <ToolbarItem Name="icon" Order="Primary" Icon="srw_circular.png" Priority="0" />
    <ToolbarItem Icon="baseline_account_circle_black_18dp.png" Order="Primary" Text="{Binding user}" Priority="0" />
    <ToolbarItem Name="LogOut" Order="Primary" Text="Log Out" Priority="0" Clicked="LogOut_Clicked"/>
</ContentPage.ToolbarItems>...

Дело в том, что это Text="{Binding user}". Я видел много разных способов привязки, но я действительно не могу заставить ни один из них работать. Надеюсь, кто-то прояснит мне это. Спасибо.


255
1

Ответ:

Класс RssUser не реализует INotifyPropertyChange, поэтому представлению никогда не сообщается, что user изменился. Пример того, как ваш класс может выглядеть после реализации интерфейса, будет примерно таким:

class RssUser: INotifyPropertyChanged
{
    private AppService _log = new AppService();
    string user;
    string pass;
    string company;

    public event PropertyChangedEventHandler PropertyChanged;

   public ICommand LoginCommmand
    {
        get
        {
            return new Command(async () =>
            {
                await _log.LoginAsync(user, pass, company);

            });
        }
    }

    public string User
    {
        set
        {
            if (user != value)
            {
                user = value;

                 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(User)))
            }
        }
        get
        {
            return user;
        }
    }
    // You would also want to similar for pass and company.
}

Наконец, вам нужно обновить привязку, чтобы она соответствовала общедоступному свойству User: Text="{Binding User}".

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