在MVVM中切换不同的页面

本文关键字:MVVM | 更新日期: 2023-09-27 18:15:22

我正试图实现在我的Xamarin MVVM项目中通过不同页面切换的能力。我有三个文件夹-"模型","视图"answers"ViewModels"。"Views"包含"MainView",它的作用是显示其他视图。

MainView.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"
             x:Class="KeepFit.Views.MainView">
  <ContentPresenter x:Name="ContentArea" Content="{Binding CurrentView}"/>
</ContentPage> 

MainView.xaml.cs:

public partial class MainView : ContentPage
{
    public MainView()
    {
        InitializeComponent();
        BindingContext = new MainViewModel();
    }
}

正如你所看到的,"MainView"被绑定到"MainViewModel"类。

MainViewModel.cs:

public class MainViewModel : INotifyPropertyChanged
    {
        public Command SwitchViewsCommand { get; private set; }
        public MainViewModel()
        {
            SwitchViewsCommand = new Command((parameter) =>
            CurrentView = (ContentPage)Activator.CreateInstance(parameter as Type)); 
            CurrentView = new HomeView();
        }
        private ContentPage _currentView;
        public ContentPage CurrentView
        {
            get
            {
                return _currentView;
            }
            set
            {
                if (value != _currentView)
                {
                    _currentView = value;
                    OnPropertyChanged("CurrentView");
                }
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName]
        string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

CurrentView在构造函数中被设置为我的HomeView(让我们说它是默认的ContentPage)。它被绑定到ContentPresenter,所以它应该在我的应用程序运行时开始时是可见的。但它不是。

我已经注意到,ContentPresenter期待Xamarin.Forms.View对象作为"内容"-我的视图继承自Xamarin.Forms.ContentPage。但是如果我将它们更改为ContentViews,例如,我将无法为它们设置BindingContext。有人能解释一下我哪里做错了吗?

在MVVM中切换不同的页面

你在试这个吗?

 async void butonClick(object sender, EventArgs e)
   {
        await Navigation.PushAsync(new EntryPageCode());
    }

你的视图实例在"EntryPageCode"的位置,好的。试试这个,告诉我,如果工作对你来说很好。