推荐使用MVVM方法,非常简单。请仔细阅读,因为在 Xamarin Forms 中处理 UI 时,MVVM 非常重要
假设我们有 2 个页面 HomePage 接受用户名,在提交时我们导航到 UserDetailsPage 显示我们在上一页输入的用户的详细信息。为简单起见,我们将仅在 UserDetailsPage 上显示用户名,而不会显示其他任何内容,以便我们了解如何使用 MVVM 方法将参数从一个页面传递到另一个页面。
所以我想从 HomePage 导航到 UserDetailsPage。
HomePage.xaml
<Entry x:Name="nameEntryField" Placeholder="Enter your Name" />
<Button Text="Submit" Clicked="GoToUserDetailsPage" />
因此在主页后面的代码中,我们将有
private void GoToUserDetailsPage(object sender, EventArgs e)
{
UserDetailsViewModel userDetailsViewModel = new UserDetailsViewModel();
userDetailsViewModel.Name = nameEntryField.Text;
Navigation.PushAsync(new UserDetailsPage(userDetailsViewModel)); // pass ViewModel object to next page
}
对于这个View页面,我们将在ViewModels文件夹
中创建一个
ViewModel类作为
UserDetailsViewModel.cs
using System.ComponentModel;
namespace MyApplication.ViewModels
{
public class UserDetailsViewModel : INotifyPropertyChanged
{
public string Name
{
get { return name; }
set { name = value; OnPropertyChanged(nameof(Name)); }
}
string name;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
现在我们将创建 UserDetailsPage
public partial class UserDetailsPage : ContentPage
{
UserDetailsViewModel ViewModel = new UserDetailsViewModel();
public UserDetailsPage(UserDetailsViewModel viewModel) // get viewModel object that will be passed from previous page
{
InitializeComponent();
ViewModel = viewModel; // Initialize ViewModel object of this class with ViewModel object that we got from previous page hence it can be used inside this Page.
BindingContext = ViewModel;
string name = ViewModel.Name; // We will get the name that was entered in previous page
}
}
在 UserDetailsPage 的 XAML 中,我们还可以通过绑定到 ViewModel 来设置其文本属性,从而添加我们从上一页获得的标签和显示名称。我们已经在构造函数中设置了这个页面的BindingContext = ViewModel;。只需像这样添加Label
<Label Text="{Binding Name}" />
这将自动将标签文本设置为我们在上一页中输入的用户名。
这样,通过创建 ViewModel 并使用 MVVM 方法,我们可以传递自定义类的对象,即 Page 的 ViewModel 类对象。