切换MVVM中的不同页面

时间:2016-10-28 18:07:35

标签: c# mvvm xamarin

我正在尝试实现在我的Xamarin MVVM项目中切换不同页面的功能。我有三个文件夹 - “模型”,“视图”和“ViewModels”。 “视图”包含“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。有人可以解释我做错了什么吗?

1 个答案:

答案 0 :(得分:0)

你试试这个吗?

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

您在“EntryPageCode”位置的视图实例,好的。 尝试这个并告诉我,如果你的工作没事的话。