C# 在WPF PRISM应用程序中的多个项目之间仅使用一个类实例
我是WPF的初学者。 我遇到了一些我无法解决的问题。 我正在开发一个由8个项目组成的应用程序。(8模块棱镜) 我也在使用MVVM模式。我在其他项目/模块中使用了一些viewmodels。 如果这些viewmodels只是我的应用程序中的一个实例,我会喜欢它。这些包含ObservableCollections,这些ObservableCollections包含数据集的记录。 我试图使用依赖注入来解决这个问题,但我无法解决这个问题。 我不知道如何注册一个类,或者我不知道应该如何解决这个问题 大家能帮帮我吗 编辑1 昨天我做了一些改变。例如,在C# 在WPF PRISM应用程序中的多个项目之间仅使用一个类实例,c#,wpf,mvvm,dependency-injection,prism,C#,Wpf,Mvvm,Dependency Injection,Prism,我是WPF的初学者。 我遇到了一些我无法解决的问题。 我正在开发一个由8个项目组成的应用程序。(8模块棱镜) 我也在使用MVVM模式。我在其他项目/模块中使用了一些viewmodels。 如果这些viewmodels只是我的应用程序中的一个实例,我会喜欢它。这些包含ObservableCollections,这些ObservableCollections包含数据集的记录。 我试图使用依赖注入来解决这个问题,但我无法解决这个问题。 我不知道如何注册一个类,或者我不知道应该如何解决这个问题 大家能帮
数据操作模块
初始化
功能中
数据处理模块:
namespace PriceCalculator.Modules.DataManipulation
{
[Module(ModuleName = ModuleNames.DataManipulationModule)]
[ModuleDependency(ModuleNames.MainMenuModule)]
public class DataManipulationModule : IModule
{
private readonly IRegionManager regionManager;
private readonly IUnityContainer container;
public DataManipulationModule(IUnityContainer container, IRegionManager regionManager)
{
this.container = container;
this.regionManager = regionManager;
}
public void Initialize()
{this.regionManager.RegisterViewWithRegion(RegionNames.MainContentRegion, () => this.container.Resolve<Views.DataManipulationView>());
}
}
}
编辑2
在那之后,我也更改了我的引导程序。我添加了一个函数
引导程序配置容器功能:
protected override void ConfigureContainer()
{
base.ConfigureContainer();
this.Container.RegisterInstance(typeof(PriceCalculator.Common.ViewModels.ButorlapViewModel), new PriceCalculator.Common.ViewModels.ButorlapViewModel());
}
这部分地解决了我的问题。因此,ButorlapViewModel
的实例已经存在,但是如果我在这个类中更改Observable集合,就会再次出现问题,因为它似乎会再次出现更多实例。在重新填充myObservableCollection
后,它在一个屏幕上显示的值与在另一个屏幕上显示的值不同
有人能帮我吗
编辑3
我已经解决了这个问题。注射很好。问题是另一个地方
因此,正确的注入如下所示。这是我的引导程序:
protected override void ConfigureContainer()
{
base.ConfigureContainer();
this.Container.RegisterType<BaseViewModel>(new ContainerControlledLifetimeManager());
this.Container.RegisterType<DataManipulationViewModelController>(new ContainerControlledLifetimeManager());
this.Container.RegisterType<NewPriceCalculationViewModelController>(new ContainerControlledLifetimeManager());
}
protected override void ConfigureContainer()
{
base.ConfigureContainer();
this.Container.RegisterType(新的ContainerControlledLifetimeManager());
this.Container.RegisterType(新的ContainerControlledLifetimeManager());
this.Container.RegisterType(新的ContainerControlledLifetimeManager());
}
这是我的一个构造函数,我在其中注入了:
public DataManipulationViewModelController(IRegionManager regionManager, IUnityContainer unityContainer)
{
this.regionManager = regionManager;
MainMenuViewUri = new Uri(ViewUriNames.MainMenuView, UriKind.Relative);
backToMainMenuCommand = new DelegateCommand(this.BackToMainMenu, this.CanBackToMainMenu);
canBackToMainMenu = new bool[10] { true, true, true, true, true, true, true, true, true, true };
this.baseViewModel = unityContainer.Resolve<BaseViewModel>();
}
公共数据操作ViewModelController(IRegionManager regionManager、IUnityContainer unityContainer)
{
this.regionManager=regionManager;
MainMenuViewUri=新Uri(viewUrames.MainMenuView,UriKind.Relative);
backToMainMenuCommand=新的DelegateCommand(this.BackToMainMenu,this.CanBackToMainMenu);
canBackToMainMenu=newbool[10]{真的,真的,真的,真的,真的,真的,真的,真的,真的,真的};
this.baseViewModel=unityContainer.Resolve();
}
谢谢大家。您在尝试使用DI时遇到了哪些具体问题?请用相关的代码示例进行说明。创建DataOperationViewModelController时,prism是否正在通过您的ctor传递ButorlapViewModel实例?您使用的是什么容器?
public DataManipulationViewModelController(IRegionManager regionManager, IUnityContainer unityContainer)
{
this.regionManager = regionManager;
MainMenuViewUri = new Uri(ViewUriNames.MainMenuView, UriKind.Relative);
backToMainMenuCommand = new DelegateCommand(this.BackToMainMenu, this.CanBackToMainMenu);
canBackToMainMenu = new bool[10] { true, true, true, true, true, true, true, true, true, true };
this.baseViewModel = unityContainer.Resolve<BaseViewModel>();
}