Передача данных по навигации - PullRequest
0 голосов
/ 27 февраля 2019

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

public void Login(string Username, string password)
{
    // ..... Do login and if success
    var Logindata = database.GetUsername(_usernamelogin);

    Application.Current.MainPage.Navigation.PushAsync(new Homepage(Logindata));

}

Мой метод получения имени пользователя -

public Register_person GetUsername(string mail1)
{
    return Conn.Table<Register_person>().FirstOrDefault(t => t.UserName == mail1);
}

моя домашняя страница XAML

В коде моей домашней страницы за cs я получаю входящие данные

public Register_person register_Person;
public Homepage (Register_person loindata)
{
    InitializeComponent ();
    l1.Text = logindata.UserName;
}

Этот код работает, я могу получить имя пользователя.Но я использую MVVM и не уверен, как реализовать это в MVVM.

1 Ответ

0 голосов
/ 27 февраля 2019

Чистый MVVM-способ сделать это состоит в том, чтобы абстрагировать навигацию и вызвать ее из вашей модели представления (см. Служба навигации Prism в качестве ссылки).В любом случае, при внедрении такого навигационного сервиса могут возникнуть некоторые подводные камни.Если это будет возможно, я бы предложил интегрировать Prism в ваше решение и использовать полную версию MVVM.

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

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App1"
             xmlns:generic="clr-namespace:System.Collections.Generic;assembly=netstandard"
             x:Class="App1.MainPage"
             x:Name="Page">

    <ContentPage.BindingContext>
        <local:ViewModel />
    </ContentPage.BindingContext>

    <!-- Your content goes here -->

</ContentPage>

В вашей модели представления вы можете теперь определить команду для входа пользователя в систему и событие, которое используется для связи с вашим представлением.что пользователь успешно вошел в систему (обратите внимание, что этот код сокращен до минимальный )

class ViewModel
{
    /// <summary>Initializes a new instance of the <see cref="T:System.Object"></see> class.</summary>
    public ViewModel()
    {
        LogInCommand = new Command(OnLogIn);
    }

    private void OnLogIn()
    {
        // your login logic shall go here
        // your password and user name shall be bound 
        // via other properties

        // Invoke the LoggedIn event with the user name 
        // of the logged in user.
        LoggedIn?.Invoke(userName);
    }

    public event Action<string> LoggedIn;

    public Command LogInCommand { get; }
}

С вашей точки зрения вы можете подписаться на LoggedIn

<ContentPage.BindingContext>
    <local:ViewModel LoggedIn="ViewModel_OnLoggedIn" />
</ContentPage.BindingContext>

И, конечно, вам нужен соответствующий метод в вашем коде (файл .xaml.cs)

private void ViewModel_OnLoggedIn(string obj)
{
    // navigate the other page here
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...