Page Navigation using MVVM in Store App

后端 未结 5 1005
我在风中等你
我在风中等你 2020-11-30 02:55

I\'m having a serious headache with this problem. I really dislike store apps but am forced to use it in this case. I\'ve only worked with XAML for a few weeks.

My q

5条回答
  •  感动是毒
    2020-11-30 03:07

    As Scott says you could use a NavigationService. I would firstly create an interface this is not needed in this example but will be useful if you use Dependency Injection (good solution with viewmodels and services) in the future :)

    INavigationService:

    public interface INavigationService
    {
        void Navigate(Type sourcePage);
        void Navigate(Type sourcePage, object parameter);
        void GoBack();
    }
    

    NavigationService.cs will inherit INavigationService you will need the following namespaces

    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    
    public sealed class NavigationService : INavigationService
    {
        public void Navigate(Type sourcePage)
        {
            var frame = (Frame)Window.Current.Content;
            frame.Navigate(sourcePage);
        }
    
        public void Navigate(Type sourcePage, object parameter)
        {
            var frame = (Frame)Window.Current.Content;
            frame.Navigate(sourcePage, parameter);
        }
    
        public void GoBack()
        {
            var frame = (Frame)Window.Current.Content;
            frame.GoBack();
        }
    }
    

    Simple ViewModel to show RelayCommand example. NB I Navigate to another Page (Page2.xaml) using the DoSomething RelayCommand.

    MyViewModel.cs

    public class MyViewModel : INotifyPropertyChanged
    {
        private INavigationService _navigationService;
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        public void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    
        public MyViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;
        }
    
        private ICommand _doSomething;
    
        public ICommand DoSomething
        {
            get
            {
                return _doSomething ??
                    new RelayCommand(() =>
                        {
                            _navigationService.Navigate(typeof(Page2));
                        });
            }
        }}
    

    In simple example Ive created the viewmodel in MainPage.cs and added the NavigationService but you can do this elsewhere depending on what your MVVM setup is like.

    MainPage.cs

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
    
            var vm = new MyViewModel(new NavigationService());
            this.DataContext = vm;
        }
    }
    

    MainPage.xaml (binds to the command DoSomething)

     
        

    Hope that helps.

提交回复
热议问题