Mvvm 如何在模块化应用程序中连接数据上下文?

Mvvm 如何在模块化应用程序中连接数据上下文?,mvvm,datacontext,Mvvm,Datacontext,我正在使用PRISM编写一个应用程序WPF。我是新来的,如果这个问题形式不好,我道歉: 我有一个模块,到目前为止,它有一个用于显示检查列表的用户控件。我的模块编写了实体和一个DbContext类来访问数据库。我的问题是应该在哪里初始化并传递到我的ViewModel中 Shell XAML <Window x:Class="ChargeMgm.Desktop.Shell" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/

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

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

Shell 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>
模块

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));
        }
    }
}
公共类模块:IModule
{
专用只读IRegionManager regionManager;
专用IUnityContainer容器;
公共缺陷模块(IUnityContainer容器、IRegionManager区域管理器)
{
this.regionManager=regionManager;
this.container=容器;
}
公共无效初始化()
{
container.RegisterType();
container.RegisterType();
container.RegisterType();
var view=container.Resolve();
if(regionManager.Regions.ContainsRegionWithName(“MainRegion”))
{
regionManager.Regions[“MainRegion”].Add(视图);
//regionManager.RegisterViewWithRegion(“MainRegion”,typeof(IDefectsView));
}
}
}

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

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

基本上,我希望您的viewmodel被注入到您的视图中,而您的DB上下文被注入到您的viewmodel中


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

初始化是什么意思?如果您使用的是Prism,那么您使用的依赖容器是什么(Unity还是MEF)?哪一个是最佳选择?我对这种模块化的东西是完全陌生的。只是想知道如何最好地在我的虚拟机中设置datacontext,以及如何将我的虚拟机连接到我的视图中。我使用了Unity,所以在我的应用程序中有一个引导程序类,你知道我如何注册模块的数据上下文和视图模型,以便在加载模块时可以在屏幕上填充对象列表吗?为帮助主管干杯。我有我的应用程序正在编译,我可以看到Unity正在实例化我的VM、视图和dataContext,但当我将视图添加到该区域时,什么都没有出现。你知道我可能错过了什么愚蠢的步骤吗?你对你的区域使用什么控制?你能编辑你的问题,上面,包括你的Xaml为该地区吗?感谢你的帮助与这个负责人。对我有好处,让我的思想进入这个棱镜/统一的概念,因为它似乎无处不在……多么糟糕。。。在我重载的构造函数中,我忽略了调用InitializeComponent!!!!!!!!!!!!!!!!!多好的工具啊。谢谢你的帮助,伙计。真的帮了大忙。干杯,你帮了大忙。非常感谢。
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));
        }
    }
}
   // 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);
    }
    }
public class View:IView
{
    public View(IViewModel viewModel)
    {
    }
}

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