我正在尝试实现这样的登录系统:
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就能绑定它吗?
答案 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 page,a good writeup和前段时间的I wrote myself。