Prism 7.1:IContainerProvider 和 IContainerRegistry
Prism 7.1 : IContainerProvider & IContainerRegistry
这里是新开发人员,正在开发我的第二个应用程序,第一个使用 Prism 7.1。
我希望在正确访问 Shell.xaml.cs 中注册的 ViewModel 方面得到一些帮助。
这是我正在使用的内容:
App.xaml.cs
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void RegisterTypes(IContanerRegistry containerRegistry)
{
containerRegistry.Register<ShellViewModel>();
}
}
Shell.xaml.cs
public partial class Shell : MetroWindow
{
public Shell()
{
InitializeComponent();
}
}
通过执行以下操作,我能够很好地访问我的 ViewModel 的属性:
var shellVM_Instance = containerProvider.Resolve<ShellViewModel>();
shellVM_Instance.IsBusy = false;
代码可以编译,但不会 运行。当我 运行 代码时,它告诉我来自上述 var shellVM_Instance 的 ShellViewModel 正在引用 ShellViewModel 类型的空对象。这让我认为我没有用 IContainerRegistry 正确注册 ViewModel。
谁能提供帮助?
我想避免使用 Bootstrapper class,并利用 Prism 7.1 提供的功能 (Brian's Release Notes)
我感谢这里的任何指导,感谢您在我尝试围绕 Prism 及其真正潜力展开思考时的耐心等待。
编辑:
我看到 IContainerRegistry 有一个 RegisterInstance 方法..
void RegisterInstance(Type type, object instance);
我一辈子都搞不懂语法。我的尝试:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
ShellViewModel shell_VM = new ShellViewModel();
containerRegistry.RegisterInstance<ShellViewModel, shell_VM>();
}
谢谢!
-克里斯
有 IContainerRegistry
and IContainerRegistryExtensions
.
所以你可以做任何一个
containerRegistry.RegisterInstance( typeof( ShellViewModel ), shell_VM );
或一般使用扩展方法
containerRegistry.RegisterInstance<ShellViewModel>( shell_VM );
最好注册为单例,以防万一你有任何依赖关系(否则你必须自己解决)
containerRegistry.RegisterSingleton<ShellViewModel>();
话虽如此,您从一开始就做错了。极少数情况下,视图模型是单例。相反,让您的视图模型通过第三方单例(EventAggregator
或您自己的服务之一)进行通信。对于你的情况,我建议这样:
public interface IApplicationBusyIndicator : INotifyPropertyChanged
{
bool IsBusy { get; set; }
}
然后让 shell 视图模型监视对 IsBusy
的更改并激活或停用您的 wait-overlay,而其他视图模型或服务在它们“正在做事。当然,如果您碰巧有不止一个参与者使应用程序繁忙并且这些操作重叠,您可以使其更复杂...
public interface IApplicationBusySetter
{
IDisposable RequestBusy();
}
然后显示 wait-screen 直到处理完所有请求。
这里是新开发人员,正在开发我的第二个应用程序,第一个使用 Prism 7.1。
我希望在正确访问 Shell.xaml.cs 中注册的 ViewModel 方面得到一些帮助。
这是我正在使用的内容:
App.xaml.cs
public partial class App
{
protected override Window CreateShell()
{
return Container.Resolve<Shell>();
}
protected override void RegisterTypes(IContanerRegistry containerRegistry)
{
containerRegistry.Register<ShellViewModel>();
}
}
Shell.xaml.cs
public partial class Shell : MetroWindow
{
public Shell()
{
InitializeComponent();
}
}
通过执行以下操作,我能够很好地访问我的 ViewModel 的属性:
var shellVM_Instance = containerProvider.Resolve<ShellViewModel>();
shellVM_Instance.IsBusy = false;
代码可以编译,但不会 运行。当我 运行 代码时,它告诉我来自上述 var shellVM_Instance 的 ShellViewModel 正在引用 ShellViewModel 类型的空对象。这让我认为我没有用 IContainerRegistry 正确注册 ViewModel。
谁能提供帮助?
我想避免使用 Bootstrapper class,并利用 Prism 7.1 提供的功能 (Brian's Release Notes)
我感谢这里的任何指导,感谢您在我尝试围绕 Prism 及其真正潜力展开思考时的耐心等待。
编辑:
我看到 IContainerRegistry 有一个 RegisterInstance 方法..
void RegisterInstance(Type type, object instance);
我一辈子都搞不懂语法。我的尝试:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
ShellViewModel shell_VM = new ShellViewModel();
containerRegistry.RegisterInstance<ShellViewModel, shell_VM>();
}
谢谢!
-克里斯
有 IContainerRegistry
and IContainerRegistryExtensions
.
所以你可以做任何一个
containerRegistry.RegisterInstance( typeof( ShellViewModel ), shell_VM );
或一般使用扩展方法
containerRegistry.RegisterInstance<ShellViewModel>( shell_VM );
最好注册为单例,以防万一你有任何依赖关系(否则你必须自己解决)
containerRegistry.RegisterSingleton<ShellViewModel>();
话虽如此,您从一开始就做错了。极少数情况下,视图模型是单例。相反,让您的视图模型通过第三方单例(EventAggregator
或您自己的服务之一)进行通信。对于你的情况,我建议这样:
public interface IApplicationBusyIndicator : INotifyPropertyChanged
{
bool IsBusy { get; set; }
}
然后让 shell 视图模型监视对 IsBusy
的更改并激活或停用您的 wait-overlay,而其他视图模型或服务在它们“正在做事。当然,如果您碰巧有不止一个参与者使应用程序繁忙并且这些操作重叠,您可以使其更复杂...
public interface IApplicationBusySetter
{
IDisposable RequestBusy();
}
然后显示 wait-screen 直到处理完所有请求。