在导航上传递数据

时间:2019-02-27 06:05:32

标签: c# linq sqlite mvvm xamarin.forms

用户登录后,我需要将数据传递到主页。我需要将用户名传递到主页。

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 :(得分:1)

完成此操作的纯MVVM方法是抽象化导航并从您的视图模型中调用它(请参阅Prisms navigation service作为参考)。无论如何,实施这样的导航服务可能会有很多陷阱。如果有可能,我建议您将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>

现在,您可以在viewmodel中定义一个命令来登录用户,并定义一个事件来与您的视图进行通信,以表明用户已成功登录(请注意,此代码被简化为 bare最低

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,以及用户名和密码的属性条目。