J'ai essayé de faire fonctionner la navigation basée sur la vue en utilisant Prism et les régions. J'ai essayé de parcourir la documentation sur MSDN, mais pour une raison que j'ignore, je n'arrive pas à la faire fonctionner, et je ne sais pas ce que je fais de mal. Voilà donc ce que je suis arrivé à ce jour:Wpf Prism Region Navigation
MainShellViewModel.cs
//Private Variables
private readonly IRegionManager _regionManager;
//Public Variables
public DelegateCommand<string> NavigateCommand { get; set; }
//Functions and Methods
public MainShellViewModel(IRegionManager regionManager)
{
//Region Manager
_regionManager = regionManager;
NavigateCommand = new DelegateCommand<string>(Navigate);
Initialize();
}
public void Initialize()
{
//Startup View
_regionManager.RegisterViewWithRegion("ViewMainFrame", typeof(Views.Dashboard));
}
public void Navigate(string uri)
{
//Navigation
if(uri != null)
{
_regionManager.RequestNavigate("ViewMainFrame", uri);
}
}
note de côté: un des nombreux tutoriels que je suivais me avait mis dans cette méthode Navigate, ai-je besoin? J'utilise MainShellViewModel comme vue principale injectée au démarrage.
DashboardViewModel.cs: (Contient l'erreur)
{
//Private Variables
private bool _canExercise = true;
//Public Variables
public bool CanExercise()
{
return _canExercise;
}
RelayCommand _exerciseSelCommand;
public ICommand ExerciseSelCommand
{
get
{
if (_exerciseSelCommand == null)
_exerciseSelCommand = new RelayCommand(ExerciseSel, CanExercise);
return _exerciseSelCommand;
}
}
//Dashboard Functions and Methods
IRegion _regionManager;
private void ExerciseSel()
{
SoundPlayers.ButtonSound();
_regionManager.RequestNavigate(new Uri("ExerciseView", UriKind.Relative)); //This gives me the error, it says it can't be nullable?
}
Voici où j'inscrire mes conteneurs/vues, etc.
Bootstrapper.cs:
protected override void ConfigureContainer()
{
base.ConfigureContainer();
#region Region Register Zone
//register views here!
Container.RegisterType(typeof(object), typeof(Views.LoginView), "LoginView");
Container.RegisterType(typeof(object), typeof(Views.Dashboard), "Dashboard");
Container.RegisterType(typeof(object), typeof(Views.ExerciseView), "SettingsView");
Container.RegisterType(typeof(object), typeof(Views.ResultsView), "ResultsView");
Container.RegisterType(typeof(object), typeof(Views.UserCreationView), "UserCreationView");
#endregion
}
Donc, fondamentalement, je Je veux juste être en mesure d'obtenir à partir du tableau de bord (qui est ma vue de démarrage actuelle) à toute autre vue qui est enregistrée dans mes conteneurs sur un clic d'un bouton.
MainShell.xaml:
<Window x:Name="Shell"
x:Class="Equinox.Views.MainShell"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:prism="http://www.codeplex.com/prism"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="Equinox"
FontFamily="Quicksand"
Height="900"
Width="1500"
SizeToContent="WidthAndHeight"
ResizeMode="CanResize"
Background="#EEF3F4"
WindowStyle="SingleBorderWindow"
Icon="/Equinox;component/favicon.ico"
WindowStartupLocation="CenterScreen">
<!-- Main View Region -->
<ContentControl x:Name="ContentControlMain"
prism:RegionManager.RegionName="ViewMainFrame"
Focusable="False"/>
Cependant, je continue à avoir des erreurs lorsque je tente de faire ma région prendre une autre vue. La façon dont je le faisais était en utilisant mon DashboardViewModel, et en créant un autre IRegionManager
nommé _regionManager
, et en faisant le RequestNavigation. Je n'ai eu aucune erreur jusqu'à ce que je l'ai couru et ai pressé le bouton qui devrait me relier à la vue suivante.
Toute aide serait appréciée!
Merci!
Pouvez-vous montrer les parties pertinentes du code VM du tableau de bord, c'est-à-dire où vous créez le IRegionManager et où vous appelez sa méthode RequestNavigation()? En outre, pouvez-vous fournir des détails sur le message d'erreur que vous voyez?Juste pour vérifier, vous devriez injecter IRegionManager dans votre VM de tableau de bord (comme vous le faites avec la VM principale), et IRegionManager doit être enregistré comme un * singleton * dans votre bootstrapper. –
Oui, désolé à ce sujet. Je viens de l'ajouter. xD – Hypergyzed