Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Постраничная навигация при помощи MVVM Light

#c_sharp #wpf #mvvm_light


скажите, как лучше организовать постраничную навигацию, если используется mvvm light?
предполагается главное окно, страница по умолчанию и еще несколько, все в главном окне
    


Ответы

Ответ 1



Объявляем интерфейс: public interface INavigationService { void Navigate(Type type); void Navigate(Type type, object parameter); void EnsureNavigated(Type pageType, object parameter); bool CanGoBack { get; } bool CanGoForward { get; } void GoBack(); void GoForward(); IView CurrentView { get; } } Реализуем этот интерфейc: using System; using System.Collections.Generic; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; public class NavigationService : INavigationService { private readonly Frame _frame; public NavigationService(Frame frame) { _frame = frame; _frame.Navigated += OnFrameNavigated; } private void OnFrameNavigated(object sender, Windows.UI.Xaml.Navigation.NavigationEventArgs e) { var view = e.Content as IView; if (view == null) return; var navMsg = new NavigationMessage() { Sender = this, NewView = view, Parameter = e.Parameter, NavigationMode = (int)e.NavigationMode }; EventManager.Current.Publish(navMsg); var viewModel = view.ViewModel; if (viewModel != null) viewModel.Initialise(e.Parameter); } public void Navigate(Type pageType) { DisposePreviousView(); _frame.Navigate(pageType); } public void Navigate(Type pageType, object parameter) { DisposePreviousView(); _frame.Navigate(pageType, parameter); } private void DisposePreviousView() { var currentView = this.CurrentView; var currentViewDisposable = currentView as IDisposable; if (currentViewDisposable != null) { currentViewDisposable.Dispose(); currentViewDisposable = null; } } public void EnsureNavigated(Type pageType, object parameter) { var currentView = this.CurrentView; if (currentView == null || currentView.GetType() != pageType) { Navigate(pageType, parameter); } } public IView CurrentView { get { return _frame.Content as IView; } } public bool CanGoBack { get { return _frame != null && _frame.CanGoBack; } } public void GoBack() { if (_frame != null && _frame.CanGoBack) _frame.GoBack(); } public bool CanGoForward { get { return _frame != null && _frame.CanGoForward; } } public void GoForward() { if (_frame != null && _frame.CanGoForward) _frame.GoForward(); } } IView: public interface IView : IDisposable { IViewModel ViewModel { get; } void Refresh(); } IViewModel: public interface IViewModel : INotifyPropertyChanged, IDisposable { void Initialise(object parameter); string ViewTitle { get; } void Refresh(); } В ХАМЛе добавить фрейм элемент: В заднике: var _navigationService = new NavigationService(this.ContentFrame); Т.е. например так: public HomePage() { this.InitializeComponent(); var _navigationService = new NavigationService(this.ContentFrame); DataContext = new HomePageViewModel(_navigationService); } Еще рекомендую почитать эту статью.

Ответ 2



нашёл такое решение: xaml xmlns:viewModels="clr-namespace:iim.ViewModels" xmlns:views="clr-namespace:iim.Views" MainViewModel.cs using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; public class MainViewModel : ViewModelBase { private object selectedViewModel; public object SelectedViewModel { get { return selectedViewModel; } set { selectedViewModel = value; RaisePropertyChanged(() => SelectedViewModel); } } private ICommand _showGridView; public ICommand ShowGridView { get { return _showGridView ?? (_showGridView = new RelayCommand(() => { SelectedViewModel = new GridVieww(); })); } } }

Комментариев нет:

Отправить комментарий