1 messaggio dal 23 novembre 2010
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
    }
}

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.