Ho analizzato il webinar "MVVM Made Simple with Prism" di Brian Lagunas. Ho seguito alla lettera il suo esempio per creare una finestra con un menù ed alcune voci, ciascuna delle quali deve aprire un'altra finestra. Purtroppo nessuna delle finestre viene aperta. La finestra da aprire viene istanziata, l'ho riscontrato dal debugger ma non si apre o quantomeno non si vede. Ho notato solo questo particolare: quando viene selezionato un item dal menù la successiva chiusura del menù generale non arresta l'applicazione. Riporto a seguire le porzioni di codice interessate, sperando di poter ricevere qualche aiuto.
*** Main windows xml (MenuPrincipale.xml) *** <Window x:Class="PBEdPallets.Views.MenuPrincipale"
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"
xmlns:local="clr-namespace:PBEdPallets.Views"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True"
mc:Ignorable="d"
Title="Menu Principale:" Height="600" Width="850">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Menu Grid.Row="0" x:Name="MenuItems" Height="19" Margin="5,5,5,0" VerticalAlignment="Top">
<MenuItem Header="Anagrafiche">
<MenuItem Header="Materiali" Command="{Binding NavigateCommand}" CommandParameter="Editor_AnaMateriali"/>
<MenuItem Header="Sottocataste" Command="{Binding NavigateCommand}" CommandParameter="Editor_AnaSottocataste"/>
<MenuItem Header="Tipi livelli pile" Command="{Binding NavigateCommand}" CommandParameter="Test"/>
</MenuItem>
</Menu>
<ContentControl Grid.Row="1" prism:RegionManager.RegionName="ContentRegion" />
</Grid>
</Window>
*** Bootstrapper.cs *** using Prism.Unity;
using Microsoft.Practices.Unity;
using PBEdPallets.Views;
using System.Windows;
namespace PBEdPallets
{
public class Bootstrapper : UnityBootstrapper
{
protected override DependencyObject CreateShell()
{
//Importo la finestra di avvio.
return Container.Resolve<MenuPrincipale>();
}
protected override void InitializeShell()
{
Application.Current.MainWindow.Show();
}
protected override void ConfigureContainer()
{
base.ConfigureContainer();
//Container.RegisterType(typeof(object), typeof(Editor_AnaMateriali), "Editor_AnaMateriali");
//Container.RegisterType(typeof(object), typeof(Editor_AnaSottocataste), "Editor_AnaSottocataste");
Container.RegisterTypeForNavigation<Editor_AnaMateriali>("Editor_AnaMateriali");
Container.RegisterTypeForNavigation<Editor_AnaSottocataste>("Editor_AnaSottocataste");
Container.RegisterTypeForNavigation<Test>("Test");
}
}
public static class UnityExtensions
{
public static void RegisterTypeForNavigation<T>(this IUnityContainer container, string name)
{
container.RegisterType(typeof(object), typeof(T), name);
}
}
}
*** MenuPrinciapaleViewModel *** using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
namespace PBEdPallets.ViewModels
{
public class MenuPrincipaleViewModel: BindableBase
{
private readonly IRegionManager _regionManager;
public DelegateCommand<string> NavigateCommand { get; set; }
#region Costruttore
public MenuPrincipaleViewModel(IRegionManager regionalManager)
{
_regionManager = regionalManager;
//Definisco l'istanza di NavigateCommand.
NavigateCommand = new DelegateCommand<string>(Navigate);
}
#endregion Costruttore
#region Private Methods
private void Navigate(string uri)
{
try
{
//ContentRegion è il nome assegnato nel tag ContentControl
_regionManager.RequestNavigate("ContentRegion", new Uri(uri, UriKind.Relative));
}
catch (Exception)
{
throw;
}
}
#endregion Private Methods
}
}