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