如何使用ViewModel绑定页面中的条目

时间:2019-03-29 10:07:47

标签: xaml mvvm xamarin.forms binding

我正在尝试实现这样的登录系统:

public Command LoginCommand => new Command(async () =>
        {
            LoginModel model = new LoginModel("dnetTest", "dnetTest"); // (get value from entry instead of "dnetTest")

        if (model.CheckInformation())
        {
            bool isSuccess = await LoginService.Login(model);
            if (isSuccess)
            {
                await Application.Current.MainPage.DisplayAlert("Пријављивање", "Успешно сте се пријавили", "OK.");
                Application.Current.MainPage = new MainPage();
            }
        }

我的LogingPage也有:

 <Label Text="Korisničko ime"/>
 <Entry x:Name="Entry_Username" Placeholder="Korisničko ime"/>
 <Label Text="Lozinka"/>
 <Entry x:Name="Entry_Password" Placeholder="Lozinka"/>
 <Button Text="Prijavi se" Command="{Binding LoginCommand}"/>

因此,我的问题是如何在LoginViewModel中将Entry_Username和Entry_Password与LoginModel绑定? 无需使用x:Names就能绑定它吗?

1 个答案:

答案 0 :(得分:1)

公平地说;这是一个非常基本的MVVM问题,很容易找到,解决方案在多个博客和页面中。但是,让我帮助您开始吧。

  

是否可以不使用x:Names来绑定它?

数据绑定的全部重点是您不必对这些控件进行任何硬引用。我们希望将逻辑与UI分开,以便我们可以轻松地替换一个或两个,而无需接触另一个。例如,假设您要实现一个新设计,如果您使用数据绑定,则只要引用这些,就可以在视图模型(或Xamarin空间中引用的页面模型)中显示当前属性。在新的用户界面中。

如果您拥有各种x:Name引用,则不仅需要触摸UI,还需要触摸视图模型,并遍历对这些字段的所有引用,并替换它们。

使用数据绑定主要提高可重用性和可测试性。

根据您的具体情况。我看不到您的完整代码,因此这里有一些假设。首先,我假设您的LoginCommand现在生活在自己的视图模型中。您已经在此处使用数据绑定,这很好。我没有直接看到为什么您需要视图模型和登录名使用单独的模型,可能您的LoginModel更像是一种服务。另外,我假设您是在没有MVVM框架帮助的情况下手动执行此操作。很高兴知道幕后发生的事情,但是我建议您考虑使用像FreshMvvm或Prism这样的MVVM框架。

保存您的XAML的登录页面,我将调用LoginPage.xaml,该页面应该有一个LoginPage.xaml.cs代码隐藏文件。在其中,进入构造函数并指定以下行:

public LoginPage()
{
    InitializeComponents();

    // This line is relevant here
    BindingContext = new LoginViewModel();
}

看到您的LoginCommand已经在使用数据绑定,这可能已经在这里。

现在,在您的LoginPage.xaml中,将XAML更改为此:

 <Label Text="Korisničko ime"/>
 <Entry Text="{Binding Username}" Placeholder="Korisničko ime"/>
 <Label Text="Lozinka"/>
 <Entry Text="{Binding Password}" Placeholder="Lozinka"/>
 <Button Text="Prijavi se" Command="{Binding LoginCommand}"/>

注意如何删除两个x:Name控件上的Text属性和Entry属性。

接下来,进入您的LoginViewModel.cs并添加两个属性,如下所示:

public string Username { get; set; }
public string Password { get; set; }

只要Entry控件中的文本发生变化,这些属性就应相应地包含该值。现在,您可以将发布的代码更改为以下代码:

public Command LoginCommand => new Command(async () =>
{
    // Notice how I changed this line
    LoginModel model = new LoginModel(Username, Password);

    if (model.CheckInformation())
    {
        bool isSuccess = await LoginService.Login(model);
        if (isSuccess)
        {
            await Application.Current.MainPage.DisplayAlert("Пријављивање", "Успешно сте се пријавили", "OK.");
            Application.Current.MainPage = new MainPage();
        }
    }

这应该为您工作!

如上所述,我建议进一步研究MVVM整体以及MVVM框架。这是Adam Pedley的official Docs pagea good writeup和前段时间的I wrote myself