1

我正在使用 PRISM 编写应用程序 WPF。如果这个问题的形式不佳,我是新来的,很抱歉:

我有一个模块,到目前为止,它有一个用于显示检查列表的用户控件。我的模块有实体编写和一个 DbContext 类来访问数据库。我的问题是这应该在哪里得到首字母并传递到我的 ViewModel?????

外壳 XAML

<Window x:Class="ChargeMgm.Desktop.Shell"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://www.codeplex.com/prism"
        Title="EMS" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition MinHeight="100"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontFamily="Calibri"
                   FontSize="16"
                   Foreground="SteelBlue"
                   Margin="5">Street Works Modules</TextBlock>
        <Border BorderThickness="1" BorderBrush="SteelBlue" CornerRadius="3" Grid.Row="1" Margin="5">
        <ItemsControl prism:RegionManager.RegionName="MainRegion"
                      VerticalContentAlignment="Stretch"
                      HorizontalContentAlignment="Stretch"/>
        </Border>
    </Grid>


</Window>

引导程序类

   class Bootstrapper : UnityBootstrapper
    {
        protected override System.Windows.DependencyObject CreateShell()
        {
            return new Shell();
        }

        protected override void InitializeShell()
        {
            base.InitializeShell();

            App.Current.MainWindow = (Window)this.Shell;
            App.Current.MainWindow.Show();
        }

        protected override void ConfigureModuleCatalog()
        {
            base.ConfigureModuleCatalog();
            ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
            moduleCatalog.AddModule(typeof(DefectModule.DefectModule));
        }
    }

模块

public class DefectModule : IModule
{
    private readonly IRegionManager regionManager;
    private IUnityContainer container;

    public DefectModule(IUnityContainer container, IRegionManager regionManager)
    {
        this.regionManager = regionManager;
        this.container = container;
    }

    public void Initialize()
    {
        container.RegisterType<IDefectsView, DefectsView>();
        container.RegisterType<IDefectsViewModel, DefectsViewModel>();
        container.RegisterType<IDefectContext, DefectContext>();
        var view = container.Resolve<IDefectsView>();
        if(regionManager.Regions.ContainsRegionWithName("MainRegion"))
        {
            regionManager.Regions["MainRegion"].Add(view);
            //regionManager.RegisterViewWithRegion("MainRegion", typeof(IDefectsView));
        }
    }
}
4

1 回答 1

3

如果您使用的是 Unity,那么您很幸运。如果您需要它初始化您的数据库上下文,那么您可以执行以下操作:

IModule 实现代码(用于您的模块)

   // Create Module http://msdn.microsoft.com/en-us/library/ff648781.aspx
    public class Module:IModule
    {
    private IUnityContainer _container;
    public Module(IUnityContainer container,IRegionManager regionManager)
    {
    _regionManager=regionManager;
    _container=container;
    }
    public Initialize()
    {
        _container.RegisterType<IView,View>();
        _container.RegisterType<IViewModel,ViewModel>();
        _container.RegisterType<IDBContext,DbContext>();
        var view=_container.Resolve<IView>();
        //Create Region http://msdn.microsoft.com/en-us/library/ff648829.aspx
        _regionManager.Regions["MainRegion"].Add(view);
    }
    }

以上将注册您的所有视图、视图模型和 dbcontext,解析它们并将它们添加到一个区域中。为了上述工作,我期待以下内容:

public class View:IView
{
    public View(IViewModel viewModel)
    {
    }
}

public class ViewModel:IViewModel
{
    public ViewModel(IDbContext context)
    {
    }
}

基本上,我希望您的 viewmodel 被注入到您的 View 中,并且您的 DB Context 被注入到您的 ViewModel 中使用Constructor Injection

顺便说一句 - 代码中的链接转到 MS 站点,这些站点将提供有关模块创建和区域的更多背景信息。我有最后一个链接:这是一个“Hello World”Prism 应用程序。它适用于 Silverlight,但就代码结构而言,这与 WPF 应用程序基本相同,因此应该很有用:Prism Hello World

于 2012-11-12T17:34:09.633 回答