Prism MVVM导航命令

时间:2016-06-20 22:02:30

标签: mvvm prism

我已经观看过网络研讨会" MVVM简化了Prism" (Brian Lagunas)。     我按照他的例子创建了一个带有菜单的主窗口     项目。当操作员选择我打开视图的项目时。应用     编译并开始但当我选择一个项目时没有任何事情发生。     我已经设置了一些断点来控制要打开的视图     istantiated,以控制正确的uri和正确的密钥使用     扩展RegisterTypeForNavigation。一切看似正确。我注意到了这一点     当我关闭MainWindow应用程序时从菜单中选择一个项目     不要自动停止。我复制一些代码字符串给你更多     细节...

主窗口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>

** 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
}

}

0 个答案:

没有答案
相关问题