【问题标题】:How to pass parameters from one Page to another in Xamarin Forms? and How to Bind View (Page) and its ViewModel and initialize ViewModel object?如何在 Xamarin Forms 中将参数从一个页面传递到另一个页面?以及如何绑定视图(页面)及其 ViewModel 并初始化 ViewModel 对象?
【发布时间】:2020-08-30 09:47:47
【问题描述】:

如何在 Xamarin Forms 中将参数或对象从一个页面传递到另一个页面?我有一个包含一些对象的页面,我想将它们传递到另一个页面

如何在 Xamarin Forms 中绑定视图(页面)及其 ViewModel 并初始化 ViewModel 对象?在 View 中初始化 ViewModel 对象的正确方法是什么?

我一直在想如何在 Xamarin Forms 中实现这两件事,最后,我想通了。这两个问题可以合二为一。

【问题讨论】:

    标签: c# xaml xamarin mvvm xamarin.forms


    【解决方案1】:

    推荐使用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 类对象。

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 2013-06-13
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 1970-01-01
      • 2023-01-24
      • 2016-01-24
      相关资源
      最近更新 更多